1

私はプログラミングに少し慣れていて(大丈夫、非常に新しい)、Extended Backus Naur Form(EBNF)に出くわし、それを使用する方法を理解しようと決心しました。残念ながら、EBNFがどのように機能するかについてはオンラインでたくさんの説明がありますが、実際にそれを実装する方法についてはほとんど貴重なものがありません。そこで、何が起こるかを確認するために、それを使用してCで簡単な小さなプログラムを作成しました。これが私が書いたものです:

#include <stdio.h>
#include <stdlib.h>


mixture : [letter|digit] {letter | digit};
integer : [ "+"|"-"] digit {digit};
naturalNumber : digit {digit};
digit : "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
letter : "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" |    "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | "A" | "B" | "C" | "D"| "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" |"Y" | "Z";


int main()
{
    char c[7];
    c[0] = '1';
    c[1] = '2';
    c[2] = '3';
    c[3] = 'x';
    c[4] = 'y';
    c[5] = 'z';
    c[6] = '\0';

    if(c == mixture){
        printf("You have a mixture of numbers and letters");
    }
    else if(c == integer){
        printf("This is just a number");
    }
    else if(c == naturalNumber){
        printf("This is just a positive number");
    }
    else if(c == digit){
        printf("This is a plain digit");
    }
    else if(c == letter){
        printf("This is a plain letter");
    }

    return 0;
}

すぐにコンパイラエラー(コードブロックを使用しています)が表示され、「:」の前に「=」が必要ですが、オンラインで読んだものはすべて「:」が正しいことを示唆しているため、「:」を使用しました。また、これを「=」に変更すると、「mixture」(およびその他)に型またはストレージクラスがないというコンパイラエラーが発生します。ええと、前の「int」は機能しませんし、「char」も両方の混合物なので意味がありません。

また、宣言がmain()の前にあるのか、その内部にあるのかはわかりません。私がオンラインで読んだ1つのことがこれが正しいことを示唆しているようだったので、私はそれを前に置くことになりました。

ちなみに、私はCでフォローするオンラインの例をまったく見つけていません-これは、EBNFについて完全に間違った方法で考えていて、このように使用できないことを意味しますか?

どんな助けでも大歓迎です。

4

4 に答える 4

4

あなたが書いているのは間違いなくCではありません。「EBNF構文の使用」と「CでのEBNFパーサーの実装」を混同していると思います。

于 2012-02-14T10:18:42.843 に答える
4

あなたが書いているものが有効でないため、エラーが発生しています C.

プログラミング言語の文法を指定する表記ツールと、プログラミング言語自体を混同しています。C 言語の構文は、BNF 文法を使用して指定されます (オンラインC99 言語標準、付録 A を参照)。これは、C コンパイラがBNF または EBNF を理解するという意味ではありません。

BNF または EBNF 仕様を取り、その文法で書かれたコードを理解するパーサーを生成できる C ベースのツールがあります。

于 2012-02-14T14:03:44.033 に答える
1

Lex と Yacc が必要です。それらをチェックしてください。

于 2012-02-14T10:16:36.200 に答える