我是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 * 2
是x =y * 1
...
如果我将1
从NUMBER
更改为filterAttribute
,那么它适用于'a' '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;。