我想解析一個小的表達式語言(我沒有從供應商定義語言)並且一切都很好,直到我嘗試使用not操作符,這是用這種語言代替。ANTLR語法不能正確處理我的「不」操作符
我的語法由這兩個環節(又名無恥剪切和粘貼)的嚴重影響:
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspxhttp://www.alittlemadness.com/2006/06/05/antlr-by-example-part-1-the-language
語言包括可以用與,或,不是運營商所使用的三種表達類型和括號改變優先級。表達式是:當我嘗試使用不操作我得到NoViableAltException
Skill("somename") > 1 | (LoggedIn("somename") & SkillExists("othername"))
然而,:
Skill("name") > some_number (can also be <, >=, <=, =, !=)
SkillExists("name")
LoggedIn("name") (this one can also have [email protected])
此輸入工作正常。我無法弄清楚爲什麼。我將我的語法與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; } ;
但是應該如何'技能( 「somename」)<10〜SkillExists(「中文別名「)'被解析?我假設'Skill(「somename」)<10'是一個'skill'表達式,'〜SkillExists(「othername」)'是一個'notexpression'。但是沒有規則匹配一個'技能',後跟一個'notexpression',對吧? –
這兩個技巧(「somename」)<10和SkillExists(「othername」)都是主要表達式,notexpression讓NOT令牌在任何主要表達式之前出現。這是否回答你的問題? 我是一個ANTLR新手,所以有可能我的語法是如此根本上有缺陷,它是超出希望。雖然我很確定我明白了,但我覺得我非常接近。 – Michael
不,你不知道爲什麼'Skill(「somename」)<10〜SkillExists(「othername」)'失敗了,這對我來說並不奇怪:它應該失敗。我試圖在我的答案的第一句話中解釋這一點。 –