コンパイラ作成日誌0x8 『Lemonパーサジェネレイタを使ってみる』

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

コンパイラ作成日誌0x8 『Lemonパーサジェネレイタを使ってみる』

投稿記事 by MoNoQLoREATOR » 11年前

おひさしぶりです。
三日坊主も100回続けばなんとやら。という精神で今までやってきましたが、遂に三日坊主すらままならなくなってしまいました。
それもこれも、全てLemonさんのせいです!!ぷんぷんです!

質問掲示板を見ている方には解ると思いますが、謎のエラーに数日間苦しめられていたのです。
しかし、それもつい先ほど解決しました。

とりあえず
「Lemonによって生成されたC言語の構文解析プログラムをメイン関数から呼んで基本的なトークンを人力で与えて、正しく構文解析できているかテストする」
という段階まで到達できました。

文法規則ファイル basic_lemon.y
► スポイラーを表示
出力ファイル basic_lemon.h
► スポイラーを表示
出力ファイルの一部 basic_lemon.c
► スポイラーを表示
出力されたファイルに手を加えたもの basic_lemon.cpp
► スポイラーを表示
出力されたファイルは拡張子が .c であるにも関わらずiostream等のC++標準ライブラリをインクルードしているし、その関係でそのままだとコンパイルが通りません。
そこで、拡張子を .cpp にしてあげる必要があります。(少なくともVisualStudio2013Expressの初期設定のままだと、そうする必要があります。)

また、main関数ですが、別ファイルに書くとLemonの関数のプロトタイプ宣言を自分で書くはめになるため、生成されたファイルに直接書き足します。
そうです。生成されたヘッダーファイルにはLemonの関数のプロトタイプ宣言は含まれていないのです!
ここがbisonとの大きな違いの一つで、不親切な部分だと思います。

さらに、assert.hがデフォルトではインクルードされていないために、エラーが出ます。
文法規則ファイルのインクルード部でインクルード文を書いてあげる必要があります。

最後に、これが最も重要なことです。
Lemonの場合、文法規則ファイルの定義で、一番先頭のものは一意である必要があります。
つまり、

CODE:

program ::= something.
は問題ないが、

CODE:

program ::= something.
program ::= another.
はエラーになるということです。



次回はflexと連携させます。
それでは、良いプログラミングライフを!
最後に編集したユーザー MoNoQLoREATOR on 2014年2月21日(金) 22:25 [ 編集 1 回目 ]

コメントはまだありません。