5
私のレクサーとパーサーに問題があります。Flex/Bison:不正なトークン管理ですか?
まず、私のレクサーに私がしたことのような行:
stmt: IF '(' exp ')' stmts
...
stmts: stmt
| '{' stmt_list '}'
| '{' '}'
ようなコードでは:
if(sth) {
dosth;
}
if(other) {
doothersth;
}
beginScope
"if" beginScope(stOTHER); return IF;
そして、私のパーサで
(私は)バイソンはif
ステートメントの終わりがわからないので、2回呼び出されますので、それは
IF
トークンを見つけたとき、彼は
を呼び出す必要があります。Flexファイルで「{」を「beginScope()」と呼びますか?そうすれば、 "}"が表示されたら 'endScope()'を実行できます。これらの1文字の式でOPENBRACEやCLOSEBRACEのようなトークンをBisonに返します。 – chrisaycock
いいえ、beginScopeは型のパラメータを必要とし、常に "{"が表示されているとは限りません。 – gnidmoo
パーサーアクションに 'beginScope'操作を移してください。必要に応じて、[mid-rule action](http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html)を使用してください。レクサーは、あなたが発見した理由のために、副作用があってはなりません。 – zwol