私は只今,C言語の構文木を用いた教育支援システムの研究をしております.そこでお聞きしたいのですが,C言語のデバッガ,またはプログラミングツールで読み込んだソースコードの構文木を出力してくれるツールはありませんか?出力形式はどのようなものでもかまいません,そのソースコードの構文情報を抽出できるものであれば.心当たりのある方,どうぞご返信くださいますようお願い申し上げます.

このQ&Aに関連する最新のQ&A

A 回答 (3件)

C/C++ではないのですがjjtreeという構文解析木操作ツールがJavaCC(御想像の通りJavaのツールです)に含まれているようです。

yacc/lexとは違い、構文解析木を操作できるみたいなので、Javaで作ればOKなのではないかなぁと思います(^^;
ただ、ツールの使い方等、いろいろ覚える事もあるでしょうから、素直に構文解析関連の書籍を読んで学習し、C/C++で作った方が楽だとは思いますが:-p
    • good
    • 0
この回答へのお礼

こんばんは,shizutaroです.何回も解答していただき,本当にありがとうございます,その上助言までしていただき,おかげで調査の時間をかなり短縮することが出来ました.
私が開発するシステムに関しては現在設計を行っており,具体的な内部設計は色々苦労しています.alfeimさんの助言は開発に向けて有効に使わせていただきます。
もし今後また何かありましたらよろしくお願いします.

お礼日時:2001/06/21 01:09

構文木を作成するツール自体はちょっと聞いた事が無いですね



yaccの解析部分に手を入れる事で実現できると思いますが・・・
もしくは自分で構文解析プログラムを組むのは駄目なんでしょうか?
ソースコードのサンプルであれば正規表現ライブラリで正規表現式の構文解析をして構文木を構築しているものがあるのでそれを参考にするとか出来ますが・・・

参考URL:http://www.vector.co.jp/soft/dos/prog/se016610.h …
    • good
    • 0
この回答へのお礼

二回にわたる回答のほうありがとうございます.どうやら私の調査でも見当たりませんでした.時間はどんどん流れていきますので,そろそろ,調査も終わりにして実際のシステム開発のほうにいこうとおもいます。わざわざありがとうございました.もし,今後再び掲示板のほうに書き込んだときは何かメッセージでも是非書き込んでください.それでは失礼します.

お礼日時:2001/06/17 17:14

これって構文木の解析ツールがほしいのでしょうか?それともデータ表示ツールですか?


データに関しては知りません。普通はループでもぶん回してprintfあたりで出力というような方法を取ると思いますが・・・

構文木解析についてはUNIXのツールでyacc/lex またはbison/flexというものがあります。どういうものかは検索エンジンか、本屋さんのUNIX系ツールあたりの棚を当たって見てください

この回答への補足

わざわざ,ご回答ありがとうございます.私の言葉が足りず,わかりづらい質問内容になってしまい申し訳ございませんでした.現在私が探しているツールは読み込んだソースコードの構文解析を行い,そのコード内容を構文木として再構築及び出力するものです.ない場合はgccないのyacc,lexファイルの解析アクション部に構文木を作成する仕掛けを組み込もうと考えています.もし,心当たりがございましたら,回答のほうよろしくお願いします.

補足日時:2001/06/15 11:47
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qこの”void(*m_pViewMode)(BYTE,BYTE,WORD);”このソースコードの意味は?

今、みているソースコードで次のようなコードがありました。


void(*m_pViewMode)(BYTE,BYTE,WORD);

--------(中略)----------------------------

m_pViewMode(err == 0 ? stKey.key : 0x00,clear,stKey.time);


全く何をどうやっているのかよくわからないのですが、これはC言語ではどのようなことをやっているソースコードなのでしょうか?

ご存じの方いらっしゃいましたらご教授お願いいたします。

Aベストアンサー

> void (*m_pViewMode)(BYTE,BYTE,WORD);
これは「関数へのポインタ」型の変数を宣言している。
m_pViewModeはBYTEとBYTEとWORDを引数に取り、返り値のない関数を保持するポインタ変数になる。

> m_pViewMode(err == 0 ? stKey.key : 0x00,clear,stKey.time);
ここでは、m_pViewModeに代入された関数を実行している。
「err == 0 ? stKey.key : 0x00」の部分が最初の引数で、三項演算子?:を用いてerrが0のときはstKey.keyを、それ以外では0x00を最初の引数にする。

Qデバッガをデバッガに掛けたい

 GDBを使ってとあるプログラムをデバッグしているんですが、GDBの動作に疑問があって詳細を調べたくなりました。そこで、デバッグ中のGDBをまたGDBに掛けてデバッグすることを考えたのですが、これを単純にやると二番目のGDBに端末を取られちゃって、一番目のほうは入力がブロックされてしまうようです。
 GDBのソースを変更せずに、こういうことを実現する方法はないでしょうか?

Aベストアンサー

ヒントにならないヒント程度の情報で申し訳ありませんが、
debugeeの方のgdbをコマンドファイル経由で動かすというのはどうでしょうか?

Debugging with GDB - 一連のコマンドのグループ化
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gdb-5.0/gdb-ja_17.html

GDBによるテスト自動化への試み
http://www.fireproject.jp/feature/gdb/advanced/auto-test.html

こういう場合にリモートデバッグってできるんですかね?

Qソースコードの間違い (C言語)

変数に、文字列を入れた配列の文字列の最後の要素数を入れたいのですが(つまり'\0')、うまくいきません。いつも2個多い値になってしまいます。

#include <stdio.h>

void main() {
char moji[100]={0};
int c=0;

fgets(moji,sizeof moji,stdin);

while( moji[c] != '\0' ) ++c;

printf("\n%d\n",c); //
}

例えば5文字の1ビット文字を入れると、最後の文字はmoji[4]にあるのでprintfで4と表示されるはずじゃないですか。でも6になるんです。いつも+2の値になるんですよ。どうやらfgetsを使っているからそうなるらしく、scanfを使うと結果は1多い値に、普通に配列に直接文字列を代入すると正常な結果になります。別にcに-2してもいいのですが、それはなんだか癪といいますか・・・。なぜこういうことがおきるのでしょうか?回答よろしくお願いします。

Aベストアンサー

>なぜこういうことがおきるのでしょうか
そのmoji[]の余計な部分にはどんなコードが入っているかは確認していますか?
リターンキーも「キー入力」の一つですよ。

QC言語のソースコードの書き方

C言語のソースコードの書き方に関する質問です。
0を5個と1を4個の、合わせて9個の数字を並べて出来上がる数列のパターン(126通り)を全て羅列させるプログラムを作りたいと考えていますが、そのためにどういった方針を立ててソースコードを書けばよいかが分かりません。
どういった構造かだけでも構いませんので、教えて頂けると幸いです。
よろしくお願いします。

Aベストアンサー

という方針で書くとこんな感じね。
#include <stdio.h>

void
print_pattern(char pattern[], int size)
{
for (int i = 0; i < size; i++) {
printf("%c", pattern[i]);
}
printf("\n");
}

void
iter(char pattern[], int end, int n, int m)
{
if (n == 0 && m == 0) {
print_pattern(pattern, end);
return;
}

if (n == 0) {
pattern[end] = 'b';
iter(pattern, end + 1, n, m - 1);
return;
}
if (m == 0) {
pattern[end] = 'a';
iter(pattern, end + 1, n - 1, m);
return;
}

pattern[end] = 'b';
iter(pattern, end + 1, n, m - 1);
pattern[end] = 'a';
iter(pattern, end + 1, n - 1, m);
}

int
main(void)
{
int m = 5, n = 4;
char pattern[m + n];
iter(pattern, 0, m, n);
return 0;
}

という方針で書くとこんな感じね。
#include <stdio.h>

void
print_pattern(char pattern[], int size)
{
for (int i = 0; i < size; i++) {
printf("%c", pattern[i]);
}
printf("\n");
}

void
iter(char pattern[], int end, int n, int m)
{
if (n == 0 && m == 0) {
print_pattern(pattern, end);
return;
}

if (n == 0) {
pattern[end] = 'b';
iter(pattern, end + 1,...続きを読む

QVC++のソースコードをチェックするツール

VC++でプログラミングしているのですが、開発効率を
あげるために、ソースコードのチェックツールがあれば
それを使おうかと思っています。
具体的には、不定値参照や未使用変数などを検出したいです。
このようなツールはありますでしょうか?

よろしくお願い足します。

Aベストアンサー

エラー表示のレベルを最高にすれば、不定値参照や未使用変数がウォーニングと表示されます。

VC++のチェック技術で足りなければ、lintを使うとチェックできますが、不定値参照や未使用変数に関しては余り期待できません。


人気Q&Aランキング

おすすめ情報