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;
}

马上我得到一个编译器错误(我正在使用代码块)说它需要在“:”之前有一个“=”,但我使用了一个“:”,因为我在网上阅读的所有内容似乎都表明“:”是正确的。此外,如果我将其更改为“=”,我会收到一个编译器错误,提示“混合”(和其他)没有类型或存储类。好吧,前面的“int”不起作用,“char”也没有意义,因为它是两者的混合体。

我也不确定声明是否应该在 main() 之前或里面。我最终把它放在了之前,因为我在网上读到的一件事似乎表明这是正确的。

顺便说一句,我发现绝对没有 C 语言中的在线示例可以遵循 - 这是否意味着我完全以错误的方式考虑 EBNF,并且根本不能像这样使用它?

任何帮助是极大的赞赏。

4

4 回答 4

4
integer : [ "+"|"-"] digit {digit};
naturalNumber : digit {digit};

您不能只在这样的 C 程序中编写 EBNF。它不是 C 语法的一部分。

另外:C 不是用于描述语法的语言。

如果您想快速创建一个可以识别 EBNF 中描述的语言的程序,您应该使用ANTLR 之类的东西。此外,此 URL是一个 ANTLR 教程,不需要太多该领域的经验,并且使用 EBNF。

于 2012-02-14T10:15:13.987 回答
4

您正在编写的绝对不是 C。我认为您混淆了“使用 EBNF 语法”和“在 C 中实现 EBNF 解析器”。

于 2012-02-14T10:18:42.843 回答
4

您收到错误是因为您正在编写的不是有效的 C。

您将指定编程语言语法的符号工具与编程语言本身混淆了。C 语言语法是使用 BNF 语法指定的(参见在线C99 语言标准,附录 A);这并不意味着 C 编译器理解BNF 或 EBNF。

有一些基于 C 的工具可以采用 BNF 或 EBNF 规范并生成能够理解以该语法编写的代码的解析器。

于 2012-02-14T14:03:44.033 回答
1

Lex 和 Yacc 是您所需要的。去看一下。

于 2012-02-14T10:16:36.200 回答