问题描述
我正在尝试通过 ANTLR (ANTLRWorks-3.5.2) 解析语言.目标是输入完整的输入,但 Antlr 给出了语法中定义部分的解析树并忽略其余输入,例如这是我的语法:
I'm trying to parse a language by ANTLR (ANTLRWorks-3.5.2). The goal is to enter complete input but Antlr gives a parse tree of defined parts in grammar and ignore the rest of inputs, for example this is my grammar :
grammar asap;
project : '/begin PROJECT' name module+ '/end PROJECT';
module : '/begin MODULE'name '/end MODULE';
name : IDENT ;
IDENT : ('a'..'z'|'A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.'|':'|'-')*;
给定输入:
/begin PROJECT HybridSailboat_2
/begin MODULE engine
/begin A2ML
/include XCP_common_v1_0.aml
"XCP" struct {
taggedstruct Common_Parameters ;
};
/end A2ML
/end MODULE
/end PROJECT
关于这个输入,我只希望解析树包含项目和模块而不是 A2ML 部分.在 antlr 中是否有可能忽略部分输入?我可以指定语法中不重要部分的起点和终点吗?
regarding to this input I just want the parse tree contains project and module and not A2ML part.Is it possible in antlr that it ignore some part of inputs?Can I specify start and end points of unimportant parts in grammar?
推荐答案
只需将 A2ML
部分作为词法分析器中的单个标记进行匹配,然后 skip()
它:
Simply match the A2ML
part as a single token in the lexer and skip()
it:
grammar asap;
project
: BEGIN_PROJECT name module* END_PROJECT EOF
;
module
: BEGIN_MODULE name END_MODULE
;
name
: IDENT
;
IDENT
: ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'.'|':'|'-')*
;
BEGIN_PROJECT
: '/begin' S 'PROJECT'
;
END_PROJECT
: '/end' S 'PROJECT'
;
BEGIN_MODULE
: '/begin' S 'MODULE'
;
END_MODULE
: '/end' S 'MODULE'
;
A2ML
: '/begin' S 'A2ML' .* '/end' S 'A2ML' {skip();}
;
SPACES
: S {skip();}
;
fragment S
: (' ' | '\t' | '\r' | '\n')+
;
这篇关于使用 ANTLR 解析时忽略输入的某些部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!