考虑以下简单语法。
grammar test;
options {
language = Java;
output = AST;
}
//imaginary tokens
tokens{
}
parse
: declaration
;
declaration
: forall
;
forall
:'forall' '('rule1')' '[' (( '(' rule2 ')' '|' )* ) ']'
;
rule1
: INT
;
rule2
: ID
;
ID
: ('a'..'z' | 'A'..'Z'|'_')('a'..'z' | 'A'..'Z'|'0'..'9'|'_')*
;
INT
: ('0'..'9')+
;
WHITESPACE
: ('\t' | ' ' | '\r' | '\n' | '\u000C')+ {$channel = HIDDEN;}
;
这是输入
forall (1) [(first) | (second) | (third) | (fourth) | (fifth) |]
语法适用于上述输入,但我想从输入中删除额外的管道符号(输入中的第二个最后一个字符)。
有什么想法/想法吗?
答案 0 :(得分:1)
我的antlr语法有点生疏,但你应该尝试这样的事情:
forall
:'forall' '('rule1')' '[' ('(' rule2 ')' ('|' '(' rule2 ')' )* )? ']'
;
即代替(r|)*
写(r(|r)*)?
。您可以看到后者如何允许零,一个或多个规则与中间的管道。