我正在为着色引擎编写一个编译器,并且每一次都正常工作,直到我到达语句解析部分。使用野牛解析元素列表
我使用的类定义的抽象语法树做所有工作(为了简化类型检查和中间代码生成)..所以我有一个祖先类ASTNode
和所有降序类,如ASTFloat
,ASTExpression
,ASTIdentifier
等上..
在.y
文件,我能够建立在共同的方式AST:
nexp:
T_LPAR nexp T_RPAR { $$ = $2; }
| nexp OP_PLUS nexp { $$ = new ASTBExpression('+', (ASTExpression*)$1, (ASTExpression*)$3); }
| nexp OP_MINUS nexp { $$ = new ASTBExpression('-', (ASTExpression*)$1, (ASTExpression*)$3); }
| nexp OP_TIMES nexp { $$ = new ASTBExpression('*', (ASTExpression*)$1, (ASTExpression*)$3); }
和它的作品相当不错,但后来我试着生成报表Ø f范围(例如如果声明的主体):我已经使用了一个ASTStatements
类,它有一个ASTNode*
的列表,必须由解析器填充每个遇到的语句。
因此,办法是与此类似:
statements:
statement { if ($$ == null) $$ = new ASTStatements(); ((ASTStatements*)$$)->addStatement($1); } statements { $$->generateASM(); }
;
的问题是,该项目应每个语句块只初始化一次,但我不知道该怎么做。使用if ($$ == null)
是我尝试过的一种黑客攻击,但它不起作用,因为yylval
可以包含任何到此为止的内容。
哪个是使用Bison处理这种情况的正常/最好的方法?
你有%type statement_if etc etc? –
2009-11-01 16:26:20
当然,我必须解决将ASTStatements *转化为具有左部分(ASTStatement *)和右部分(ASTStatements *)的类的问题。我其实把名单变成了退化的树.. – Jack 2009-11-01 23:21:39