3

許してください。私は構文解析とlex/yaccにまったく慣れていません。おそらく頭を悩ませていますが、それでも次のようになります。

私はPLYを使用してかなり基本的な計算機を書いていますが、その入力は必ずしも方程式であるとは限らないため、解析時にそうであるかどうかを判断する必要があります。入力の極値は、方程式に対して完全に評価され、それが細かく解析されて計算されるもの、または方程式のようなものではなく、解析に失敗して細かくされるものになります。

灰色の領域は、方程式のような部分を持つ入力であり、パーサーがその部分を取得して処理します。これは私が望んでいることではありません-エラーをスローバックできるように、文字列の一部が取得およびトークン化されていないかどうかを判断できる必要がありますが、これを行う方法がわかりません。

基本的に、「残っているものをキャッチする」トークンを定義する方法を知っている人はいますか?それとも私がこれを処理できるより良い方法はありますか?

4

4 に答える 4

1

erroryaccには組み込みのトークンがあります。通常、次のようなことを行います。

line: goodline | badline ;

badline : error '\n' /* Error-handling action, if needed */

goodline : equation '\n' ;

一致しない行はすべて。equationによって処理されbadlineます。

エラー処理アクションで使用yyerrokして、エラー処理が次の行で確実にリセットされるようにすることができます。

于 2009-05-08T23:33:39.680 に答える
1

トークン(入力の終わり)を定義し、レクサーが入力の終わりにそれを出力するようにします。

したがって、以前は、これらのトークンがあった場合:

'1' 'PLUS' '1'

これで、次のようになります。

'1' 'PLUS' '1' 'END_OF_INPUT'

これで、パーサーで最上位のルールを定義できます。代わりに(たとえば):

Equation ::= EXPRESSION

あなたが持っているでしょう

Equation ::= EXPRESSION END_OF_INPUT

明らかに、これらをPLY構文で書き直す必要がありますが、これでほとんどの方法が得られるはずです。

于 2009-05-11T06:31:03.463 に答える
0

私は通常、別の「コマンドリーダー」を使用して、完全なコマンド(おそらくあなたの場合は1行)をホスト変数文字列に取得し、字句解析プログラムが文字列に到達しなかったときに通知するなど、文字列を分析するように調整します。終わり。これを設定するのは難しいですが、エラー報告のいくつかのクラスを簡単にします。私がこの手法を日常的に使用している場所の1つには、3つのコメント規則、2セットの引用符付き文字列、およびその他の厄介なものを含む複数行のコマンドがあります(コンテキスト依存のトークン化-うん!)。

それ以外の場合は、Yaccの「エラー」トークンを使用したDonのアドバイスが適切です。

于 2009-05-09T00:06:45.560 に答える
0

あなたはすでに解決策を見つけたようですが、あなたや他の人が別のアプローチに興味がある場合に備えて、別の提案を追加します。

PLYを使用しているとおっしゃっていますが、それはコンパイラをPython環境で実行したいからですか?もしそうなら、あなたは他のツールも検討するかもしれません。そのような仕事には、Pythonコードジェネレーターを備えたANTLR( http://www.antlr.org )をよく使用します。ANTLRには、レクサーレベルで大量の入力を食べるなどのトリックがたくさんあるので、パーサーはそれを見ることができません(コメントなど)、より大きな文法内でサブルール(方程式など)を呼び出す機能(一度終了する必要があります)ルールはこれ以上入力を処理せずに一致しました...あなたがやりたいことのように聞こえます)そして非常に素晴らしい左因数分解アルゴリズム。

StringTemplate(http://www.stringtemplate.org)エンジンの使用と組み合わせたANTLR解析機能は、優れた組み合わせを実現し、両方ともPythonをサポートします(他にも多数あります)。

于 2009-05-12T14:51:13.653 に答える