c程序中的EBNF声明语法

EBNF declaration syntax in c program

我对编程有点陌生(好吧,非常新),我遇到了扩展的巴科斯-诺尔形式,或者EBNF,并决定尝试找出如何使用它。不幸的是,尽管网上有大量关于ebnf如何工作的解释,但在如何实际实现它方面却鲜有可贵之处。所以我用C语言编写了一个简单的程序,看看会发生什么。我写的是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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;
}

我马上得到一个编译器错误(我使用的是代码块),它要求在":"之前有"=",但我使用了":",因为我在网上阅读的所有内容似乎都表明":"是正确的。另外,如果我把它改为"=",我会得到一个编译器错误,上面说"混合物"(和其他的)没有类型或存储类。嗯,前面的"in t"不起作用,"char"也没有意义,因为它是两者的混合物。

我也不确定声明是应该放在main()之前还是放在它里面。我把它放在之前,因为我在网上看到的一件事似乎表明这是对的。

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

非常感谢您的帮助。


你写的绝对不是C。我认为您混淆了"使用ebnf语法"和"在C中实现ebnf解析器"。


你收到错误是因为你写的不是有效的C。

您将编程语言的语法与编程语言本身混淆在一起。C语言语法是使用bnf语法指定的(参见联机c99语言标准,附录A);这并不意味着C编译器理解bnf或ebnf。

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


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

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

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

如果您想快速创建一个能够识别ebnf中描述的语言的程序,那么应该使用类似antlr的东西。此外,这个URL是一个ANTLR教程,它不需要在这个领域有太多的经验,并且使用ebnf。


您需要的是lex&yacc。检查一下。