我用antlr扭曲一个简单的语言,我在AntlrWorks中定义了一个Lexer语法,但是当我想生成java代码时,它给了我错误:
Antlr错误:以下令牌定义永远不能匹配,因为先前的令牌匹配相同的输入:FLOAT_OR_INT,OPEN_PAR,CLOSE_PAR,....(几乎适用于所有规则!)
我是antlr的新手,我认为这是因为规则位置的顺序,但我不知道他们应该怎么做,我的错误是什么?
这是语法:
lexer grammar OurCompiler;
options
{
k=5;
}
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
protected
INT : ('0'..'9')+
;
protected
FLOAT : INT '.' INT
;
FLOAT_OR_INT : ( INT '.' ) => FLOAT { $setType(FLOAT); }
| INT { $setType(INT); }
;
OPENPAR_OR_OUTPUT_OPERATOR : '(' { $setType(OPEN_PAR); } | '(' '(' { $setType(OUTPUT_OPERATOR); }
;
CLOSEPAR_OR_INPUT_OPERATOR : ')' { $setType(CLOSE_PAR); } | ')' ')' { $setType(INPUT_OPERATOR); }
;
protected
OPEN_PAR : '(' ;
protected
CLOSE_PAR : ')' …Run Code Online (Sandbox Code Playgroud) 我写过这个语法:
expr : multExpr ( ('+' | '-') multExpr )*;
multExpr : atom ( ('*' | '/') atom )*;
atom : INT | FLOAT | ID | '(' expr ')';
condition : cond ('or' cond)*;
cond : c1 ('and' c1)*;
c1 : ('not')? c2;
c2 : '(' condition ')' | boolean;
boolean : expr (relop expr | ²) | 'true' | 'false';
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';
Run Code Online (Sandbox Code Playgroud)
我已经省略了INT,FLOAT,ID的词法规则,因为很明显.
问题是c2规则,它是模棱两可的,因为'(',我找不到解决方案,你能给我一个解决方案吗?