1

假设我有一个语法处理全局变量和 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;正确但随后它想将声明规则也应用于第二行,并且在到达 ( 时失败,此时我希望它回溯并应用下一个规则,这是程序的规则。有人可以告诉我为什么这没有发生?

4

1 回答 1

1

你把你所有的语法都贴出来了吗?我无法在您发布时编译它......但我玩弄了您发布的内容以使其与您的示例相匹配:

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

我建议您为令牌匹配创建词法分析器规则(大写的规则),而不是使它们成为您的解析器规则的一部分 - 如您所见,我已经为您完成了其中的一些。

于 2012-02-15T00:37:30.363 回答