【问题标题】:Remove extra symbol from the repetitive ANTLR rule从重复的 ANTLR 规则中删除多余的符号
【发布时间】:2012-12-19 15:51:42
【问题描述】:

考虑以下简单语法。

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

语法适用于上述输入,但我想从输入中删除额外的管道符号(输入中的倒数第二个字符)。
有什么想法/想法吗?

【问题讨论】:

    标签: java antlr dsl antlr3 antlrworks


    【解决方案1】:

    我的 antlr 语法有点生疏,但你应该试试这样:

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

    也就是说,不要写(r|)*,而是写(r(|r)*)?。您可以看到后者如何允许零个、一个或多个规则之间有管道。

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 1970-01-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多