【发布时间】:2015-06-01 08:03:10
【问题描述】:
我有下面的语法(为演示而简化),但在与逻辑运算符相关的特定情况下我遇到了问题。
除了逻辑运算符在我引用的标识符内的情况外,我测试的所有内容都有效。例如这有效:
@M = "ABC12345"
但这不是:
@M = "ABC12OR345"
字符串中的 OR 会导致以下错误
外部输入 'OR' 期望 {'"", LOWCHAR
我不知道如何获得正确的优先级。
谢谢
grammar PRDL;
options
{
language=CSharp;
}
statement
: expression ( logicalOperator expression )*
;
logicalOperator
: logicalOR | logicalAND
;
logicalOR
: OR
;
logicalAND
: AND
;
expression
: mVar
| nVar
| parenStatement
| notExpression
;
parenStatement
: LPAREN statement RPAREN
;
notExpression
: NOT expression
;
mVar
: M equalityOperator quotedIdentifier
;
nVar
: N equalityOperator quotedIdentifier
;
equalityOperator
: EQUAL
;
quotedIdentifier
: '"' identifier '"'
;
identifier
: (HIGHCHAR | LOWCHAR | DIGIT)+
;
// ============ Lexer Defintions ========================
// OPERATORS
NOT_ALLOWED : '*' | '/' | '+' | '-' | '#' | '$' | '%' | '^';
EQUAL : '=';
COMMA : ',';
LPAREN : '(';
RPAREN : ')';
LPARENSQ : '[';
RPARENSQ : ']';
OR : ('OR' | 'or' | '||');
AND : ('AND' | 'and' | '&&');
NOT : ('NOT' | 'not' | '!') ;
M : '@M';
N : '@N';
LOWCHAR : 'a'..'z';
HIGHCHAR : 'A'..'Z';
DIGIT : '0'..'9';
// Whitespace -- ignored
WS : [ \n\t\r\f]+ -> skip;
【问题讨论】: