Java 多选择错误
如果我尝试执行ANTLR语法,则会出现以下异常: 决策可以使用多个选项匹配输入,例如“数字..字母”:1、2 我的语法是这样的: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
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 | '_';