ANTLR多个替代错误

时间:2011-11-06 18:44:07

标签: java error-handling antlr

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 ';';

问题在于按类型和字段多次使用标识符。

请帮我纠正我的语法。

谢谢。

1 个答案:

答案 0 :(得分:3)

假设您正在尝试解析输入"abc"(不带引号)。现在,您的field规则包含type identifier,而type也可以匹配identifier。所以你可以说解析器应该能够匹配identifier identifier。但是如何将输入“分开”呢?解析器可以将"a"与第一个identifier"bc"匹配到第二个identifier。但它也可以将"ab"与第一个匹配,将"c"与第二个匹配。

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

您的词霸不应该创建ALPHADIGITLETTER令牌。这些规则只应由其他词法分析器使用(因此它们应标记为“片段”规则)。

最后,就像标识符规则一样,您应该将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 | '_';