ANTLR语法在解析类似规则时不会回溯

ANTLR语法在解析类似规则时不会回溯,antlr,grammar,ambiguity,backtracking,Antlr,Grammar,Ambiguity,Backtracking,假设我有一个处理全局变量的语法和一些C变量的方法声明 program: (declaration)* (procedure)*; declaration: typespec identifier ';'; procedure: typespec identifier '(' ')' ';'; typespec: 'char' | 'int'; identifier: ('a' .. 'z' | 'A' .. 'Z') ('A' - 'Z' | 'a' .. 'z' | '0' .. '9' |

假设我有一个处理全局变量的语法和一些C变量的方法声明

program: (declaration)* (procedure)*;
declaration: typespec identifier ';';
procedure: typespec identifier '(' ')' ';';
typespec: 'char' | 'int';
identifier: ('a' .. 'z' | 'A' .. 'Z') ('A' - 'Z' | 'a' .. 'z' | '0' .. '9' | '_')*;
如果我喂它一些东西,比如:

int MAX;
char proc();

语法为int MAX;正确,但它希望将声明规则也应用于第二行,并且在到达时失败(,此时,我希望它会回溯并应用下一条规则,即过程规则。有人能告诉我为什么不会发生这种情况吗?

你发布了所有语法吗?我无法在你发布时编译它……但我使用了你发布的内容使其与你的示例相匹配:

program: (declaration)* (procedure)*;
statement: TYPE_SPEC IDENT ;
declaration: statement ';';
procedure: statement '(' ')' ';';

TYPE_SPEC 
    :   'char' | 'int';

IDENT 
    :   ('a' .. 'z' | 'A' .. 'Z') ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' | '_')*;

WHITESPACE
    :   ('\r' | '\n' | '\r\n' | ' ' | '\t' ) {$channel=HIDDEN;} 
    ;

我建议你制定lexer规则(大写)对于您的标记匹配,而不是将其作为解析器规则的一部分-如您所见,我已经为您完成了其中的一些操作。

您发布了所有语法吗?我无法在您发布时将其编译…但我使用了您发布的内容使其与您的示例相匹配:

program: (declaration)* (procedure)*;
statement: TYPE_SPEC IDENT ;
declaration: statement ';';
procedure: statement '(' ')' ';';

TYPE_SPEC 
    :   'char' | 'int';

IDENT 
    :   ('a' .. 'z' | 'A' .. 'Z') ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' | '_')*;

WHITESPACE
    :   ('\r' | '\n' | '\r\n' | ' ' | '\t' ) {$channel=HIDDEN;} 
    ;

我建议您为令牌匹配制定lexer规则(大写),而不是将其作为解析器规则的一部分——正如您所看到的,我已经为您制定了一些规则。

这不是全部语法,我只是孤立了一个示例。我试着运行您的语法,得到了以下((program NoViableAltException(6@[)*2:10的回送:(声明)*])当你测试时,你输入了什么输入?上面的输入。问题是我用解释器运行了它,我得到了那个错误。如果我用工具创建了实际的词法分析器和解析器,它就会工作。我想我被解释器愚弄了一整天:|这不是整个语法,我只是孤立了一个例子。我试着运行你的语法,我得到了一个以下((程序NoViableAltException(6@[()*2:10的环回:(声明)*]))您在测试时输入了什么输入?上面的输入。问题是我用解释器运行了它,我得到了那个错误。如果我用工具创建实际的lexer和parser,它会工作。我想我被解释器愚弄了一整天:|