これは、コンパイラー内でFIRST&FOLLOWセットをエンコードする方法について尋ねた前の質問のフォローアップですが、これは私のプログラムの設計に関するものです。
再帰下降パーサーを作成して、コンパイラーの構文解析フェーズを実装しています。ソースプログラムの構文のエラーをより効率的に処理できるように、FIRSTセットとFOLLOWセットを利用できる必要があります。すべての非終端記号のFIRSTとFOLLOWをすでに計算しましたが、プログラムのどこに論理的に配置するか、そしてそれを行うのに最適なデータ構造を決定するのに苦労しています。
注:すべてのコードは擬似コードになります
オプション1)マップを使用し、名前ですべての非終端記号を、FIRSTセットとFOLLOWセットを含む2つのセットにマップします。
class ParseConstants
Map firstAndFollowMap = #create a map .....
firstAndFollowMap.put("<program>", FIRST_SET, FOLLOW_SET)
end
これは実行可能なオプションのように見えますが、パーサーの内部では、FIRSTとFOLLOWを取得してエラー関数に渡すために、次のような醜いコードが必要になります。
#processes the <program> non-terminal
def program
List list = firstAndFollowMap.get("<program>")
Set FIRST = list.get(0)
Set FOLLOW = list.get(1)
error(current_symbol, FOLLOW)
end
オプション2)非終端記号ごとにクラスを作成し、FIRSTプロパティとFOLLOWプロパティを設定します。
class Program
FIRST = .....
FOLLOW = ....
end
これにより、コードが少し見栄えが良くなります。
#processes the <program> non-terminal
def program
error(current_symbol, Program.FOLLOW)
end
これらは私が考えた2つのオプションです。これらの2つのセットをエンコードする方法について他の提案を聞きたいです。また、私が投稿した2つの方法に対する批評や追加も役に立ちます。ありがとう
私もここにこの質問を投稿しました:http://www.coderanch.com/t/570697/java/java/Encode-FIRST-FOLLOW-sets-recursive