我正在用ANTLR编写一个解析器,并且坚持认为为什么解析器将某些文本识别为完全错误的规则而不是正确的规则,即使正确的规则具有更高的优先级(我认为)。
这是我要解析的文本:
class Program {
int x;
int c = 4;
void init ( )
{
int a,b,d;
x = 10;
}
}
相关规则为(不包括操作代码):
program
: CLASS PROGRAM_2 BRACE_OPEN field_decls method_decls BRACE_CLOSE // Program
{} ;
field_decls returns [long id]
: field_decl field_decls
{}
|
{};
field_decl returns [List<Long> list, String name]
: TYPE field_decl_one_var SEMICOLON // FieldDecl
{}
| TYPE ID EQUAL_SIGN literal SEMICOLON // InitedFieldDecl
{};
field_decl_one_var returns [List<String> strs]
: (ID | ID BRACKET_OPEN NUMBER_LITERAL BRACKET_CLOSE) field_decl_vars
{};
field_decl_vars returns [List<String> strs]
: field_decl_var field_decl_vars
{}
|
{};
field_decl_var returns [List<String> strs]
: COMMA ID
{}
| ID BRACKET_OPEN NUMBER_LITERAL BRACKET_CLOSE
{};
method_decls returns [long id]
: method_decl method_decls
{}
|
{};
method_decl returns [List<Long> list, String name]
: ( TYPE | 'void' ) ID PARENTHESIS_OPEN method_decl_one_arg PARENTHESIS_CLOSE block // MethodDecl
{};
基本上,ANTLR将int c = 4;
识别为method_decl
,然后抱怨缺少寄生函数(这很快使我的代码崩溃)。预期的行为是将该行视为嵌套在InitedFieldDecl
的{{1}}下的FieldDecl
。
解析器给出的错误是int x;
,由于解析不正确,代码崩溃发生在line 4:7 mismatched input '=' expecting '('
操作代码中。
我尝试将method_decls
设置为单独的规则,并将其放入InitedFieldDecl
/ program
/ field_decls
模式中,并将其交织为{{1} }的第一个模式定义。我什至删除了field_decl_var_one
行,而ANTLR仍将field_decl
视为int x;
。
我只是不明白为什么ANTLR认为那条线是错误的模式/规则。我应该怎么做才能正确识别线路?