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。检查一下。