Antlr - 不匹配的输入' 1'期待数量

时间:2015-06-10 11:48:16

标签: antlr

我是Antlr的新手,我有以下简化语言:

StockItem = db.StockItems.Where(x => x.StockCode == "SCH113").First() 
            ? quoteItem.Chassis.Longitudinal 
            : quoteItem.BodyType.Longitudinal

适用于db.StockItems.Where(x => x.StockCode == "SCH113").First(),但它不适用于grammar Hello; sentence : targetAttributeName EQUALS expression+ (IF relationedExpression (logicalRelation relationedExpression)*)?; expression : '(' expression ')' | expression ('*'|'/') expression | expression ('+'|'-') expression | function | targetAttributeName | NUMBER; filterExpression : '(' filterExpression ')' | filterExpression ('*'|'/') filterExpression | filterExpression ('+'|'-') filterExpression | function | filterAttributeName | NUMBER | DATE; relationedExpression : filterExpression ('<'|'<='|'>'|'>='|'=') filterExpression | filterAttributeName '=' STRING | STRING '=' filterAttributeName ; logicalRelation : 'AND' | 'OR' ; targetAttributeName : 'x'| 'y' ; filterAttributeName : 'a' | 'a' '1' | targetAttributeName; function: simpleFunction | complexFunction ; simpleFunction : 'simpleFunction' '(' expression ')' | 'simpleFunction2' '(' expression ')' ; complexFunction : 'complexFunction' '(' expression ')' | 'complexFunction2' '(' expression ')' ; EQUALS : '='; IF : 'IF'; STRING : '"' [a-zA-z0-9]* '"'; NUMBER : [-]?[0-9]+('.'[0-9]+)?; DATE: NUMBER NUMBER NUMBER NUMBER '.' NUMBER NUMBER? '.' NUMBER NUMBER? '.'; WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

错误消息如下:

  

你好::句子:1:7:不匹配的输入&#39; 1&#39;期待{&#39; simpleFunction&#39;,&#39; complexFunction&#39;,&#39; x&#39;,&#39; y&#39;,&#39; complexFunction2&#39;,&#39 ;(&#39;,&#39; simpleFunction2&#39;,NUMBER}

对我来说这很奇怪,因为x = y * 2x =y * 1 ...

如果我将1NUMBER更改为filterAttribute,那么它适用于'a' '1',但我不了解这两种情况之间的区别。有人可以帮我解释一下吗?

感谢。

1 个答案:

答案 0 :(得分:2)

通过这样做:

filterAttributeName :
    'a' |
    'a' '1' |
    targetAttributeName;

ANTLR从这些内联令牌创建词法分析器规则。所以你真的有一个像这样的词法分析器语法:

T_1 : '1': // the rule name will probably be different though
T_a : 'a';
...
NUMBER : [-]?[0-9]+('.'[0-9]+)?;

换句话说,输入1将被标记为T_1,而不是NUMBER

修改

每当某个输入可以匹配两个或更多lexer规则时,ANTLR会选择首先定义的那个。词法分析者不会&#34;听&#34;解析器在特定时间查看它需要什么。 lexing和解析是两个不同的阶段。这就是ANTLR的工作原理,以及许多其他解析器生成器。如果你不能接受这个,你应该google for&#34; scan-less parsing&#34;或&#34; packrat解析器&#34;。