• 締切済み

字句解析プログラムについて

学校の課題でわからないところがあり教えていただけるととてもうれしいです。だれかお願いします 字句解析サンプルプログラム(lex2.c)について答えなさい。  lex2.が認識するトークンをBNFで表記しなさい。  lex2.cを以下のように拡張しなさい。 整数表記を <integer>::= <digit> {<digit>|'_'}* 以下のようなトークンも判別できるようにしてみる。 句切り文字:'(', 句切り文字:')', 句切り文字:';', 演算子:'=' ソースプログラムの拡張部分の抜粋とコンパイルコマンドと実行結果を提出すること。 (ソースプログラムへのコメントまたは簡単な説明を付けると評価は少しプラス) lex2.c #include <stdio.h> /********************************************************** * 識別子(identifier)を判別するプログラム * <ident>::= <alphabet>|'_' {<alphabet>|<digit>|'_'>}* **********************************************************/ #define isAlphabet(c) (('a'<=c && c<='z') || ('A'<=c && c<='Z')) #define isDigit(c) ('0'<=c && c<='9') // inputの先頭から識別子を読みこむ // identに識別子を表す文字列を入れ、読みこんだ文字数を返す // (識別子でなければ 0 が返る) int getIdent(char *input, char *ident) { char *start=input; /* 1文字目が英字または「_」なら識別子*/ if (isAlphabet(*input) || *input=='_') { *ident ++= *input++; /* 2文字目以降が、英字または「」または数字ならば識別子 */ while (isAlphabet(*input)|| isDigit(*input) || *input=='_') { *ident++=*input++; } } *ident='\0'; /*読んだ文字数を返すことにする*/ return input - start; } /********************************************************** * 正の整数定数を判別するプログラム * <integer>::= {<digit>}* **********************************************************/ //inputから正の整数定数を読みこむ //valueに整数定数の値を入れ、読みこんだ文字数を返す int getInt(char *input, int *value) { int v=0; char * start = input; /*練習に作ってみること*/ while (isDigit(*input)) { v=(v*10)+ (*input++ - '0'); } *value = v; return input - start; } int lex(char *input) { int i, n, num_of_tokens; char ident[1026]; int value; num_of_tokens = 0; while (*input !='\0') { //空白文字を読みとばす while (*input == ' ' || *input == '\t' || *input =='\r') input++; //先頭をトークンに変換する if ((n=getIdent(input, ident))>0) { printf("識別子: %s (%d文字)\n", ident, n); input += n; num_of_tokens++; } else if ((n=getInt(input, &value))>0) { printf("整数定数: %d (%d文字)\n", value, n); input += n; num_of_tokens++; } else if ( *input == '+' || *input == '-' || *input == '*' || *input== '/') { printf ("演算子:%c\n", *input); input++; num_of_tokens++; } else if (*input=='\n'){ printf("改行\n"); input++; } else { printf("エラー:%cは不正な文字\n", *input); input++; } } return num_of_tokens; } char line[1024]; int main(int argc, char* argv[]) { if (argc != 2) { printf("使いかた: %s '一行のテキスト'\n", argv[0]); exit(1); } printf("トークン数は%d個!\n", lex(argv[1])); }

みんなの回答

  • meadow02
  • ベストアンサー率0% (0/0)
回答No.2

>lex2.cが識別するトークンをBNFで示しなさい コメントに書いてあるのが、BNFです 例えば、正の整数定数を判別するプログラム <integer>::= {<digit>}* は整数値(integer)は数値(digit)から成ることを表しています。 つまり、<integer>が識別するトークンは <digit>::=012345..9から、整数値の0~9 となります。 このプログラムは、正の整数値と識別子・演算子・区切り文字から成るプログラムなので、その表現をBNFで書いたものが答えと成ります。 >整数表記を <integer>::= <digit> {<digit>|'_'}* 先程の改良版です。 正の整数をdigitだけではなく、'_'もトークンの一部として判別させてやるようにプログラムを書けばよいです。 つまり、10_23と仮に有った場合は 10=整数値、_=識別子、23=整数値 という風に判別されるのではなく 10_23=1023=整数値 と判別させるように改良させればよいのです >以下のようなトークンも判別できるようにしてみる。 句切り文字:'(', 句切り文字:')', 句切り文字:';', 演算子:'=' これについても同様に改良すれば出来るでしょう。 あまり、ご自身の課題を丸投げしないほうが良いです。 答える側も迷惑ですし、何より自分の力になりませんよ。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

問題は分かったけど, あなたが分からないところが分からん. 人に聞くときには, 自分がどこまで理解わかっていてどこで困っているのかを明確にすること.

fei0102
質問者

補足

すいませんでした…わからないところはBNFとはどういう風に書けばいいのか、またlex2.cの解説として入っている説明の意味もわからないという手付かずの状態です。

関連するQ&A

専門家に質問してみよう