在ANTLR BNF语法符号中,epsilon的等价物是什么?

Ami*_*irh 6 java validation antlr antlr3

在利用ANTLR 3.3时,我正在改变当前语法以支持没有括号的输入.这是我的语法的第一个版本:

grammar PropLogic;

        NOT : '!' ;
        OR  : '+' ;
        AND : '.' ;
        IMPLIES : '->' ;
        SYMBOLS : ('a'..'z') | '~' ;
        OP : '(' ;
        CP : ')' ;

    prog    : formula EOF ;


    formula : NOT formula
        | OP formula( AND formula CP | OR formula CP | IMPLIES formula CP)
        | SYMBOLS ;


    WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;
Run Code Online (Sandbox Code Playgroud)

然后我改变它以支持适当的功能:

grammar PropLogic;

    NOT : '!' ;
    OR  : '+' ;
    AND : '.' ;
    IMPLIES : '->' ;
    SYMBOL : ('a'..'z') | '~' ;
    OP : '(' ;
    CP : ')' ;
    EM : '' ;

prog    : formula EOF ;


formula : OP formula( AND formula CP | OR formula CP | IMPLIES formula CP)
    | ( NOT formula | SYMBOL )( AND formula | OR formula | IMPLIES formula | EM ) ;


WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+    { $channel = HIDDEN; } ;
Run Code Online (Sandbox Code Playgroud)

但我一直面临以下错误:

error<100>:  syntax error: invalid char literal: ''
error<100>:  syntax error: invalid char literal: ''
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能克服这个错误?

Bar*_*ers 8

你的代EM币:

EM : '' ;
Run Code Online (Sandbox Code Playgroud)

无效:您无法匹配词法规则中的空字符串.

要匹配epsilon(无),你应该这样做:

rule 
  :  A 
  |  B 
  |  /* epsilon */ 
  ;
Run Code Online (Sandbox Code Playgroud)

当然,/* epsilon */可以安全地删除评论.

请注意,当您在当前语法中执行此操作时,ANTLR会抱怨可以使用多个备选方案匹配规则.这是因为你的语法含糊不清.