C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Boost:spirit パース中に解析内容を追加する(?)


(過去ログ 47 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■25611 / inTopicNo.1)  Boost:spirit パース中に解析内容を追加する(?)
  
□投稿者/ ゆうと (1回)-(2008/09/23(Tue) 23:35:01)
ゆうと さんの Web サイト

分類:[C/C++] 

はじめまして。ゆうと と申します。
開発環境はVisual C++ 2005 Express Edition で、
Boostのバージョン 1.35.0 を使って開発をしております。

今、自作言語を作っていて、その構文解析にBoostのSpiritを使っているのですが、
パース中に"#include"等のキーワードがヒットした時に、パースする内容を
インクルードファイルに移す方法が分かりません。
色々なホームページを調べてみたのですが、自分が必要としている
解説や講座は見つかりませんでした(;_;
spiritのドキュメントでは(http://boost.cppll.jp/HEAD/libs/spirit/doc/position_iterator.html)
ポジションイテレータ 等の情報が載っていたのですが、コレだけの情報では
ちんぷんかんぷんでした(^^;)

ご存知の方教えていただけないでしょうか?
よろしくお願いいたします<(_ _)>

引用返信 編集キー/
■25612 / inTopicNo.2)  Re[1]: Boost:spirit パース中に解析内容を追加する(?)
□投稿者/ ネタ好き (643回)-(2008/09/23(Tue) 23:42:45)
No25611 (ゆうと さん) に返信
>パースする内容をインクルードファイルに移す方法が分かりません。

申し訳ないのですが、正直言ってここがわからないです。
私は一応コンパイラを何度も作っているの者ですが、このような事をしたいと思った事がありません。
もし、ここがわかったら力になれるかもしれませんので、説明して頂きたいです。
引用返信 編集キー/
■25613 / inTopicNo.3)  Re[2]: Boost:spirit パース中に解析内容を追加する(?)
□投稿者/ ゆうと (3回)-(2008/09/24(Wed) 00:25:01)
ゆうと さんの Web サイト
説明不足で申し訳ございません<(_ _)>

例えば、"a.hoge"という名前で

print("あああ");

と言う内容のスクリプトが在るとします。(適当な文法でスミマセン(^^;)


解析する内容のスクリプトは
#include "a.hoge"
print("いいい");

だとしたら、Spiritでこのファイルをパースすると、
まず、"#include"が読み込まれ、次に"a.hoge"が読み込まれますよね?
そうしたらセマンティックアクションを起こして、
「parse」関数の対象を"a.hoge"に移して構文を解析したいのです。

ただ「parse」関数に渡す「解析する内容のスクリプト」が代入された変数に
"a.hoge"の内容を加えるだけでは、エラーが"a.hoge"側で起こったときに、
区別されないのでどちらのファイルで起こったエラーか分からなくなってしまいます。

・・・自分でもちょっと分からない文章になってしまったのですが(^^;分かりますでしょうか?

コンパイラを創られた事のある方にアドバイスを頂けるなんて感激です!
宜しくお願いします。
引用返信 編集キー/
■25619 / inTopicNo.4)  Re[3]: Boost:spirit パース中に解析内容を追加する(?)
□投稿者/ ネタ好き (644回)-(2008/09/24(Wed) 10:04:51)
No25613 (ゆうと さん) に返信
> 例えば、"a.hoge"という名前で
>
> print("あああ");
>
> と言う内容のスクリプトが在るとします。(適当な文法でスミマセン(^^;)
>
>
> 解析する内容のスクリプトは
> #include "a.hoge"
> print("いいい");
>
> だとしたら、Spiritでこのファイルをパースすると、
> まず、"#include"が読み込まれ、次に"a.hoge"が読み込まれますよね?
> そうしたらセマンティックアクションを起こして、
> 「parse」関数の対象を"a.hoge"に移して構文を解析したいのです。

大体状況が飲み込めて来ました。
ただ、残念ながら処理を別ファイルへ移すという概念がコンパイラには無いと思います。
理由は次の通りです


・プリプロセッサは「前処理」であって、それ以外のものとは別パスの処理です。

・C風の#Includeは、解析では無くてテキストベースの情報追加処理です。
例えば、#include <stdio>はstdio.hの関数宣言を宣言したファイルへテキストで追加する処理です。

・C++風の#includeはメモリ内でシンボルテーブルを組み立てる形式です。
従って、ファイルへ移るという処理ではありません。
ただし、シンボル出現位置を覚えておいて、エラーメッセージで使用するということは一応ありえます。


何かのヒントになるでしょうか?
引用返信 編集キー/
■25620 / inTopicNo.5)  Re[4]: Boost:spirit パース中に解析内容を追加する(?)
□投稿者/ ネタ好き (645回)-(2008/09/24(Wed) 10:12:54)
一つ言い忘れていました。
コンパイラでの構文解析は、そもそもファイルベースではありません。

例えば・・・
#include "a.hoge"
print("いいい");
の場合は、コンパイラは構文解析で次のように考えます。

#include "a.hoge"←別パスで処理済なので出てこない
print ← リテラル文字
( ←記号
" ←記号
いいい ←文字列
" ←記号
) ←記号
; ←記号

printリテラルは関数か?
関数の構文では【記号 記号 文字列 記号 記号 記号】は妥当か?


引用返信 編集キー/
■25669 / inTopicNo.6)  Re[5]: Boost:spirit パース中に解析内容を追加する(?)
□投稿者/ ゆうと (5回)-(2008/09/24(Wed) 15:04:50)
ゆうと さんの Web サイト
大変参考になりました!!ありがとうございます!

#includeや#defineなどのプリプロセッサは構文解析の前に行うのですね。
構文解析と一緒にやろうとして分からなくなってしまいました(^^;
ネタ好きさんの教えて下さったC風の#Includeの方法でやってみようと思います!

本当にありがとうございました!!(^-^)ゞ
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -