【发布时间】:2011-09-08 04:01:22
【问题描述】:
我正在尝试解析一种小型表达式语言(我没有定义来自供应商的语言),一切都很好,直到我尝试使用 not 运算符,这是该语言中的波浪号。
我的语法深受这两个链接的影响(又名无耻的剪切和粘贴):
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspxhttp://www.alittlemadness.com/2006/06/05/antlr-by-example-part-1-the-language
该语言由三种表达式类型组成,可以与 and、or、not 运算符和括号更改优先级一起使用。表达式是:
Skill("name") > some_number (can also be <, >=, <=, =, !=)
SkillExists("name")
LoggedIn("name") (this one can also have name@name)
这个输入工作正常:
Skill("somename") > 1 | (LoggedIn("somename") & SkillExists("othername"))
但是,一旦我尝试使用 not 运算符,我就会得到 NoViableAltException。我不知道为什么。我已经将我的语法与 codeproject.com 链接上的 ECalc.g 进行了比较,它们似乎匹配,一定有一些我看不到的细微差别。失败:
Skill("somename") < 10 ~ SkillExists("othername")
我的语法:
grammar UserAttribute;
options {
output=AST;
ASTLabelType=CommonTree;
}
tokens {
SKILL = 'Skill' ;
SKILL_EXISTS = 'SkillExists' ;
LOGGED_IN = 'LoggedIn';
GT = '>';
LT = '<';
LTE = '<=';
GTE = '>=';
EQUALS = '=';
NOT_EQUALS = '!=';
AND = '&';
OR = '|' ;
NOT = '~';
LPAREN = '(';
RPAREN = ')';
QUOTE = '"';
AT = '@';
}
/*------------------------------------------------------------------
* PARSER RULES
*------------------------------------------------------------------*/
expression : orexpression EOF!;
orexpression : andexpression (OR^ andexpression)*;
andexpression : notexpression (AND^ notexpression)*;
notexpression : primaryexpression | NOT^ primaryexpression;
primaryexpression : term | LPAREN! orexpression RPAREN!;
term : skill_exists | skill | logged_in;
skill_exists : SKILL_EXISTS LPAREN QUOTE NAME QUOTE RPAREN;
logged_in : LOGGED_IN LPAREN QUOTE NAME (AT NAME)? QUOTE RPAREN;
skill: SKILL LPAREN QUOTE NAME QUOTE RPAREN ((GT | LT| LTE | GTE | EQUALS | NOT_EQUALS)? NUMBER*)?;
/*------------------------------------------------------------------
* LEXER RULES
*------------------------------------------------------------------*/
NAME : ('a'..'z' | 'A'..'Z' | '_')+;
NUMBER : ('0'..'9')+ ;
WHITESPACE : ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; } ;
【问题讨论】:
-
但是
Skill("somename") < 10 ~ SkillExists("othername")应该怎么解析呢?我假设Skill("somename") < 10是skill表达式,~ SkillExists("othername")是notexpression。但是没有规则匹配skill后跟notexpression,对吧? -
Skill("somename")
-
不,不是真的,你想知道为什么
Skill("somename") < 10 ~ SkillExists("othername")失败了,这对我来说并不奇怪:它应该失败。我试图在我回答的第一句话中解释这一点。