Compiler construction ANTLR歧义问题

Compiler construction ANTLR歧义问题,compiler-construction,antlr,Compiler Construction,Antlr,我有这个语法 grammar MyGrammar; prog : lexeme* ; lexeme : TOK_INTLIT : [0-9]+; Identifiers : Letter (Letter | Digit | '_' )* ; fragment Letter : [a-zA-Z] ; fragment Digit : [0-9] ; ... 现在当我输入这个:int2x=20 我期望标识符出现错误,但得到如下输出: Type = TOK_INT value

我有这个语法

grammar MyGrammar;
prog : lexeme* ;

lexeme :
TOK_INTLIT  : [0-9]+;
Identifiers  : Letter (Letter | Digit | '_' )* ;
fragment Letter     : [a-zA-Z] ;
fragment Digit      : [0-9] ;
...
现在当我输入这个:
int2x=20

我期望标识符出现错误,但得到如下输出:

Type = TOK_INT value = [int] Line 1, Column 0,
Type = TOK_INTLIT value = [2] Line 1, Column 4,
Type = Identifiers value = [x] Line 1, Column 5,

2x
正在拆分。我是做错了什么,还是有办法解决这些问题?

为什么这是个问题?语法不会拒绝那个标记序列吗?或者
int2x=20实际上是合法的吗?在后一种情况下,为什么不应该
int2x=20也是合法的吗?为什么你会惊讶于
2x
被标记为
TOK_INTLIT
,后面跟着
标识符
标记?好吧,我想在2x上显示一个错误,因为标识符只能以字母开头。我应该为错误标记放一个语法,以便它识别错误的序列吗?@MissakBoyajian是的,标识符只能以字母开头,而数字可以(而且必须)以数字开头。这不像是标记器告诉您“2x”是一个标识符。它告诉你“2”是一个数字,“x”是一个标识符,这符合规则。如果您有语法规则
typedecl:type标识符'='expression';',则ANTLR将正确地抱怨
int2x=20无效,因为您提供了一个需要标识符的数字。这不是你想要的吗?是的,你是对的。谢谢