A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
本当はなんらかの本を調達した方がいいような気がします.
トップレベルには外部変数の宣言やら構造体の宣言やら関数の宣言やらが並ぶのですが, ここでは宣言の順序が重要なので「順序が保存できるようなデータ構造」を使うことになります. 木でも線形リストでも OK. 意味的には線形リストだけど, イメージ的には木かなぁ.
また, これらの宣言にはたいてい「名前」がつきます. 変数の宣言なら変数名だし, 関数の宣言なら関数名です. で, プログラム中ではこの名前でしかアクセスしないので, 「名前から宣言の内容がアクセスできる」データ構造, いわゆる「記号表」も持つことになります. もちろん関数や構造体には「その中でのみ有効な名前」があるので, これらはそれぞれで独自の記号表を持ちます.
なお, C++ にしろ Java にしろ, 構文解析・意味解析そのものはあまり C と変わらないんじゃないかな....
回答ありがとうございます。
今考えている段階では、変数はローカル変数のみで、関数・構造体は順番を気にせず使えるように作りたいと思っていますから、既存の言語と仕様が異なることが多い気はしています。
また、記号表に関しては調べた結果、構文解析や意味解析を通して作るつもりです。
とりあえずプログラム全体で木を作りながら、必要な情報を記号表に追加していくということで作っていきたいと思います。
他にも意見があったら参考にしたいので、回答は募集します。
No.3
- 回答日時:
回答を募集するのはいいんだけど, それと並行して実際にプログラムを組み出すべきだと思います. 実際に組んでみるとどうすればいいかってのもそれなりに見えるかもしれない.
あと, #2 で「C などの手続き型言語では」って書いたんだけど, これは「どのようなプログラム言語を作ろうとしているのか」によって形が変わる可能性があるということを念頭に置いています. たとえば多くのスクリプト言語では関数定義などの非実行文とそれ以外の実行文とが混在できるので, そのようなものの場合には「非実行文は非実行文でまとめ, 実行文はそれだけでまとめる」という構成でいくとあとが楽になるかもしれません.
APL とか J は変態なので無視.
ご指摘ありがとうございます。
作り始めて構文解析にとりかかったところで、疑問に思ったので質問しました。
本当はC++やjavaのようなオブジェクト指向が作りたいのですが、難しいと思ったのでCのような言語を作ったうえでオブジェクト指向に変えていこうと考えています。(CがC++になったような感じで)
No.2
- 回答日時:
専門家でもないしこの辺は言語によるかもしれないしと逃げを打ちつつ....
C などの手続き型言語ではトップレベルの宣言ごとに構文木を作るかなぁ. トップレベルの宣言だと名前を持っていて「名前でアクセスする」ことが多いので, 木構造で管理する必要はないと思う. むしろ「名前でアクセスする」ことに特化したデータ構造 (ハッシュや 2分探索木など) でそれぞれの解析結果を管理する方が楽になるんじゃないかな.
逆に, if や for のように「部分構造として文を含む文」が存在するので, 「1つの文に 1つの木」というのはちょっと無理があると思う. いや, もちろん「木」は作るんだけど, それが単独で存在するんじゃなくって「ほかの木の一部になる」ってこと. もちろん
{ a; b; c; }
という複合文に対し a, b, c の 3つの文 (から作った構文木) をリストなどで持つことは十分考えられます.
回答ありがとうございます。
ますます悩んできましたが、とりあえず一つのプログラムを一つの木にし、関数や変数は別の表のようなもので管理してみることにします。
回答は引き続き募集します。
No.1
- 回答日時:
私は専門家でもないのであまり覚えていませんが、プログラム全体で木を作るはず。
BNFをそのまんま木にすることを考えてください。(※)
http://www.hpcs.is.tsukuba.ac.jp/~msato/lecture- …
プログラム全体でひとつの構文木を持つ場合、解析器にプログラムを投げたら、そのプログラムの構文木が出てきます。解析器の中では、再帰的に文法を解釈し、構文木を作っていきます。
文ひとつひとつで構文木を作る場合、プログラム全体はどのようなデータ形式で持つのでしょうか?結局木を持つことになりませんか?
関数名などを解釈するのはこのさらに次の段階になります。それらも一気にやってしまいたいなら後者の手法もありかも知れませんが、それは前者の方法でも可能なことです。
あとは専門家の方に・・・。
※厳密さに関する言い訳
BNFは文法の表示形式のひとつです。これだけで全ての文法が表せるわけではありません。また、構文木はBNFとはさらに異なる概念です。
回答ありがとうございます。
>>文ひとつひとつで構文木を作る場合、プログラム全体はどのようなデータ形式で持つのでしょうか?結局木を持つことになりませんか?
確かにその通りですね。
一つ考えていたのは、配列か何かで多く木を管理することも考えたのですが、全体を気にしたほうが簡単な気がしました。
引き続き回答は募集します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 数学の教科書について 3 2023/01/29 21:10
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- 哲学 説得力を修辞の巧みさまたは論理の強さの2つに分析するにはどうすると良いでしょうか? 0 2022/07/20 05:46
- 大学受験 自己推薦書の添削や意見・アドバイスお願いします 2 2022/08/27 19:34
- 統計学 加重最小二乗法=①「変数を自然対数変換」=②「誤差項の分散の逆数を重み付け」? 8 2022/11/26 11:15
- クラフト・工作 木材のマス目と板目につきまして 2 2023/06/29 06:16
- 哲学 説得力を論理の強さまたは修辞の巧みさの2つに分析するにはどうすると良いでしょうか? 4 2022/07/05 04:47
- 事件・事故 木村隆二容疑者による岸田文雄襲撃事件が自作自演でないと思う人は、その根拠を教えてちょ。 3 2023/04/25 21:16
- 心理学 卒業論文の分析について 1 2022/09/05 14:19
- 教育・学術・研究 仕事の方向性を変えたい。経営分析→数値解析 1 2023/06/18 16:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
360度を超える角度
-
Visual Basic 三辺の長さ? ...
-
main関数終了時のreturnの意味は?
-
3つの整数のうち奇数のみを表示...
-
Delphi 6 で 2進数→10進数変換
-
Fortran90についての質問です。
-
JCLの基本について教えてください
-
fortran if文
-
Sublime Text 3でのFortranプロ...
-
c言語です
-
変数の値が勝手に変化する原因
-
プログラミング
-
N88basicを用いたGPIB制御
-
4桁の数値を逆に表示されるプ...
-
あるプログラムのコマンドライ...
-
Excelで4096点以上のFFTの方法
-
このプログラミング誰か教えて...
-
65536は2の何乗なのでしょうか?
-
C++ で、「)」が必要 というエ...
-
正しい五十音順について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミング
-
【JAVA】数字をひし形に出力す...
-
変数の値が勝手に変化する原因
-
ruby
-
JCLの基本について教えてください
-
値Xを入力し、その平方根を画面...
-
N88basicを用いたGPIB制御
-
COBOLのピリオド
-
ProC 固定SQLでNULLってどう表...
-
Fortran90についての質問です。
-
main関数終了時のreturnの意味は?
-
360度を超える角度
-
C言語 バッファについて。
-
3つの整数のうち奇数のみを表示...
-
Fortran "実引数の型が仮引数の...
-
Delphi 6 で 2進数→10進数変換
-
javaで整数nを入力し、それが素...
-
fortran if文
-
3次関数を作るプログラム
-
BASICプログラム入門 副書名 プ...
おすすめ情報