我正在爲着色引擎編寫一個編譯器,並且每一次都正常工作,直到我到達語句解析部分。使用野牛解析元素列表
我使用的類定義的抽象語法樹做所有工作(爲了簡化類型檢查和中間代碼生成)..所以我有一個祖先類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