2016-10-05 1 views
0

長年かけてレクサーとパーサーに戻ってきた私は、文脈の目的のために、国家の変化という概念に困惑していました。私はパーサーとしてレモンを使用し、自分のレクサーをまとめています。パーサーは事前にトークンを先読みしていると仮定する必要がありますか?

だが、このような例の入力を見てみましょう:

[groups] 
syscon: 
    0x000 sysmemremap 
    0x004 presetctrl 

[registers] 
sysmemremap: 
    map  1-0 
    rsvd 31-2 
presetctrl:32 
    mux  2-0 
..etc... 

だから、「シスコン:」と「sysmemremapは:」同じように見えるが、1つはGROUPNAMEであり、他はREGISTERNAMEです。実際には各トークンが何であるかを決定する[グループ]と[レジスタ]の間にコンテキストの変更があります。

このような対話的な変更を行うのに最適な位置にあるパーサーですか?パーサーはセクション文法を持たないため、文法のセットがある環境で適用され、別のセットで使用される場合、レクサーは、モードがそのようにする必要があります。

EDIT:問題まとめたウィキペディアでジャスト発見「レクサー・ハック」エントリ:すべての識別子は、同じフォーマットを持っているので、追加のコンテキストがなければ

は、レクサーは、他の識別子からタイプ識別子 を区別することはできません。 ....解決策は、一般に、セマンティックシンボルテーブルからの情報をレクサーにフィードバックすることからなる。すなわち、 は、レクサーからパーサーへの純粋な一方向パイプラインとして機能するのではなく、 の意味解析からバックアウトまでのバックチャネルがレクサーにあります。

(これは私が持っている質問を除いて)パーサーがトークンを先読みしていると仮定することはできますか?パーサが先に打ち負かされ、より良い一致をするためにもっと多くのトークンを読み込んでいるなら - それはある程度はやることが期待されますが、パーサーの状態変化がレクサーにとっては遅すぎるという状況にうまくいく可能性がありますそれはすでにそのトークンに会って処理しました!

これを熟考していますか?

答えて

0

私自身の質問に答えることができるかもしれません。パーサが内部的に行っていることに依存することは、悪い計画である可能性が高いと思います。

私は自分のLexとYaccの本(O'Reillyのもの)を見つけたので、Lexセクションの例の1つは状態の変更です - 単語 "動詞"が表示されると、それを見上げることに反対した。その仕事はレクサーで行われるので、それはレクサーでやっているのです。

関連する問題