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)
有谁知道我怎么能克服这个错误?
你的代EM币:
EM : '' ;
Run Code Online (Sandbox Code Playgroud)
无效:您无法匹配词法规则中的空字符串.
要匹配epsilon(无),你应该这样做:
rule
: A
| B
| /* epsilon */
;
Run Code Online (Sandbox Code Playgroud)
当然,/* epsilon */可以安全地删除评论.
请注意,当您在当前语法中执行此操作时,ANTLR会抱怨可以使用多个备选方案匹配规则.这是因为你的语法含糊不清.