2012-05-14 6 views
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トークンを見つけたとき、彼は

+0

を呼び出す必要があります。Flexファイルで「{」を「beginScope()」と呼びますか?そうすれば、 "}"が表示されたら 'endScope()'を実行できます。これらの1文字の式でOPENBRACEやCLOSEBRACEのようなトークンをBisonに返します。 – chrisaycock

+0

いいえ、beginScopeは型のパラメータを必要とし、常に "{"が表示されているとは限りません。 – gnidmoo

+3

パーサーアクションに 'beginScope'操作を移してください。必要に応じて、[mid-rule action](http://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Actions.html)を使用してください。レクサーは、あなたが発見した理由のために、副作用があってはなりません。 – zwol

答えて

1

ザックが述べたように...

が私を助けてください...その if文の終わりとして取り、他の if声明を開始するために、それをもう一度読んでコメントでは、パーサーのアクションから

stmt: IF { beginScope(stOTHER); } '(' exp ')' stmts 
関連する問題