我正在使用野牛(3.0.4)和词法分析器来实现 Decaf 编程语言的(部分)语法。我只是在实现类内的内容。
因此,我的任务很简单:将每个生产规则(作为字符串)存储在树中,然后将其打印出来。
例如,如果您将以下代码行作为输入
class Foo { Foo(int arg1) { some2 a; } }
你(必须)得到以下输出
<ClassDecl> --> class identifier <classBody>
<ClassBody> --> { <VariableDecl>* <ConstructorDecl>* <MethodDecl>* }
<ConstructorDecl> --> identifier ( <ParameterList> ) <Block>
<ParameterList> --> <Parameter> <, Parameter>*
<Parameter> --> <Type> identifier
<Type> --> <SimpleType>
<SimpleType> --> int
<Block> --> { <LocalVariableDecl>* <Statement>* }
<LocalVariableDecl> --> <Type> identifier ;
<Type> --> <SimpleType>
<SimpleType> --> identifier
第一个问题(已解决)是它解析了变量声明而不是构造函数声明,尽管我在类本身的范围内没有变量声明(即我只有在构造函数的块内)。这解决了。
不过,如果我给出以下内容class abc { some1 abc; john doe; }
,它会说syntax error, unexpected SEMICOLON, expecting LP
. 因此,第 19 行的字符导致了问题。
这是.y文件(仅classBody规则)
class_decl:
CLASS ID LC class_body RC
;
/* FIXME: Gotta add more grammar here */
class_body: var_declmore constructor_declmore method_declmore
| var_declmore constructor_declmore
| var_declmore method_declmore
| constructor_declmore method_declmore
| method_declmore
| var_declmore
| constructor_declmore
| %empty
;
var_declmore: var_decl
| var_declmore var_decl
;
constructor_declmore: constructor_decl
| constructor_declmore constructor_decl
;
var_decl: type ID SEMICOLON
| type ID error
;
constructor_decl: ID LP parameter_list RP block
| ID error parameter_list RP block
;
这是完整.y文件的要点。