小编naf*_*seh的帖子

Antlr错误:以下令牌定义永远不能匹配,因为先前的令牌匹配相同的输入

我用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)

antlr

4
推荐指数
1
解决办法
3554
查看次数

如何解决这种模棱两可的语法?

我写过这个语法:

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规则,它是模棱两可的,因为'(',我找不到解决方案,你能给我一个解决方案吗?

antlr antlrworks antlr3

3
推荐指数
1
解决办法
453
查看次数

标签 统计

antlr ×2

antlr3 ×1

antlrworks ×1