考虑下面的简单语法。

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) |]


语法对于上面的输入工作正常,但是我想摆脱输入中多余的管道符号(输入中的倒数第二个字符)。
有什么想法/想法吗?

最佳答案

我的antlr语法有点生锈,但是您应该尝试这样的操作:

forall
    :'forall' '('rule1')' '[' ('(' rule2 ')' ('|' '(' rule2 ')' )* )? ']'
    ;


即,写(r|)*代替(r(|r)*)?。您会看到后者如何允许零,一个或多个规则以及介于两者之间的管道。

关于java - 从重复的ANTLR规则中删除多余的符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13956097/

10-14 07:41