Java 多选择错误

Java 多选择错误,java,error-handling,antlr,Java,Error Handling,Antlr,如果我尝试执行ANTLR语法,则会出现以下异常: 决策可以使用多个选项匹配输入,例如“数字..字母”:1、2 我的语法是这样的: grammar twp3; ALPHA : ('a'..'z'|'A'..'Z'); DIGIT : ('0' .. '9'); LETTER : ALPHA | '_'; identifier : LETTER ( LETTER | DIGIT )*; number : DIGIT+; type : primitiveType | i

如果我尝试执行ANTLR语法,则会出现以下异常:

决策可以使用多个选项匹配输入,例如“数字..字母”:1、2

我的语法是这样的:

grammar twp3;
ALPHA   : ('a'..'z'|'A'..'Z'); 
DIGIT :  ('0' .. '9');
LETTER  : ALPHA | '_';
identifier  :   LETTER ( LETTER | DIGIT )*;
number  :  DIGIT+;
type    :   primitiveType  | identifier |('any' 'defined' 'by' identifier);
primitiveType   :   'int' | 'string' | 'binary' | 'any';
typedef :   structdef | sequencedef | uniondef | forwarddef;
field   :   'optional'? type identifier ';';
问题在于按类型和字段多次使用标识符

请帮我改正语法


谢谢。

假设您正在尝试解析输入
“abc”
(不带引号)。现在,您的
字段
规则包含
类型标识符
,并且
类型
也可以匹配
标识符
。因此,您可以说解析器应该能够匹配
标识符。但如何“划分”投入?解析器可以将
“a”
与第一个
标识符
相匹配,将
“bc”
与第二个
标识符
相匹配。但它也可以将
“ab”
与第一个匹配,将
“c”
与第二个匹配

解析器可以从单个输入创建多个解析的事实是语法中的歧义(您遇到的错误消息)。原因是您试图在解析时创建标识符,而您应该在lexer时创建它们。因此,如果您创建
identifier
的lexer标记,而不是解析器标记,那么一切都应该正常

您的lexer不应该创建
字母
数字
字母
标记。这些规则只能由其他lexer使用(因此它们应该标记为“片段”规则)

最后,就像标识符规则一样,您应该将
number
规则设置为lexer规则,而不是解析器规则(lexer规则以大写字母开头,解析器规则以小写字母开头):


非常感谢你的建议。它解决了我的问题。
grammar twp3;

type          : primitiveType  | Identifier | 'any' 'defined' 'by' Identifier;
primitiveType : 'int' | 'string' | 'binary' | 'any';
field         : 'optional'? type Identifier ';';

Identifier : LETTER (LETTER | DIGIT)*;
Number     : DIGIT+;

fragment ALPHA  : ('a'..'z'|'A'..'Z'); 
fragment DIGIT  : ('0' .. '9');
fragment LETTER : ALPHA | '_';