Wenn我尝试执行ANTLR语法我得到以下异常:
决策可以使用多种替代方式匹配输入,例如“DIGIT..LETTER”: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 ';';
问题在于按类型和字段多次使用标识符。
请帮我纠正我的语法。
谢谢。
答案 0 :(得分:3)
假设您正在尝试解析输入"abc"
(不带引号)。现在,您的field
规则包含type identifier
,而type
也可以匹配identifier
。所以你可以说解析器应该能够匹配identifier identifier
。但是如何将输入“分开”呢?解析器可以将"a"
与第一个identifier
和"bc"
匹配到第二个identifier
。但它也可以将"ab"
与第一个匹配,将"c"
与第二个匹配。
解析器可以从单个输入创建多个解析的事实是语法中的歧义(您遇到的错误消息)。它的原因是你试图在分析时创建标识符,而你应该在lexer-time创建它们。因此,如果您创建identifier
而不是解析器令牌的词法分析器令牌,那么一切都应该没问题。
您的词霸不应该创建ALPHA
,DIGIT
和LETTER
令牌。这些规则只应由其他词法分析器使用(因此它们应标记为“片段”规则)。
最后,就像标识符规则一样,您应该将number
规则作为词法分析器规则而不是解析器规则(词法分析器规则以大写字母开头,解析器规则以小写字母开头):
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 | '_';