antlr3 - 在布尔表达式语法中如何解决电话号码的歧义问题

  显示原文与译文双语对照的内容

我试图编写一个布尔表达式语法,可以将WHITE_SPACE视为隐式逻辑,。 比如,"a"表示"a 和B"。

但是,我还希望将美国格式化的电话号码作为单个令牌,比如,( 123 ) 456 -7890. 我的语法可以涵盖大多数情况,但在AREA_CODE上仍面临语法歧义。

这是我的语法:


grammar myBooleanExpr;

options
{
 language = Java;
 output = AST;
}

tokens {
 AND;
}

fragment DIGIT : '0'..'9';
fragment AREA_CODE : LPAREN DIGIT+ RPAREN;
fragment NUMBER : ( DIGIT | '-' )+;
LPAREN : '(' ;
RPAREN : ')' ;
WS : ( ' ' | 't' | 'r' | 'n' )+ { $channel = HIDDEN; };
L_AND: 'AND'| 'And' | 'and';
OR : 'OR' | 'Or' | 'or';
NOT : 'NOT' | 'Not' | 'not';
NAME : (~( ' ' | 't' | 'r' | 'n' | '(' | ')' | '"') )*;
PHONE : AREA_CODE ' '? NUMBER?;
QUOTED_NAME : '"'.*'"';

expression : orexpression;
orexpression : andexpression (OR^ andexpression)*;
andexpression : notexpression (L_AND? notexpression)* -> ^(AND notexpression+); 
notexpression : NOT^ atom | atom;
atom : NAME | PHONE | QUOTED_NAME | LPAREN! orexpression RPAREN!;

输入 vs 应为输出:

( 123 ) 456 -7890> ( 123 ) 456 -7890//单个令牌

( 123 ) abc -> 123和 abc//两个标记

( 123456 ) 789.> 123456和 789//当前失败的两个令牌 ###

( 12 34 ) -> 12和 34//当前失败的两个令牌 ###

( 123 ) 456-aaaa -> 123和 456-aaaa//两个令牌 ### 当前失败

abc efg and hij abc abc tokens

我很难理解 input.LA(1)的用法。 如果有人能帮助我解决这个问题,非常感激。

时间: 作者:

我想你是在把太多的内容融入到lexer规则中。 解析需要更灵活的电话号码,比如的一个空间字符可以能不够,并且选项卡不足。 相反,你应该像通常一样,在解析器运行的语法树上进行一次语义检查。

由你决定两个标记之间的空间是否仅仅是或者可以解释为逻辑操作( 和这里) 。 解析器和lexer都不能知道,它依赖于上下文。 这就是为什么你不能让ambiquities免费语法的原因。

作者:
...