我想解析一些 C++ 代码,作为指南,我一直在查看 C lex/yacc 定义:http://www.lysator.liu.se/c/ANSI-C-grammar-l.html 和 http://www.lysator.liu.se/c/ANSI-C-grammar-y.html
我了解代币本身的规范,但不了解它们如何交互。例如。可以让诸如 = 之类的运算符直接跟在标识符后面而不插入空格(即“foo=”),但在数字常量之后紧跟标识符(即 123foo)是不行的。但是,我看不到任何表示此类规则的方式。
我错过了什么?...或者这个 lex/yacc 在接受错误方面太自由了。
最佳答案
词法分析器将字符流转换为标记流(我认为这就是您所说的标记规范)。语法指定了可接受的标记序列。因此,您不会看到某些内容是不允许的;你只看到什么是允许的。那有意义吗?
编辑
如果要让词法分析器将序列“123foo”与序列“123 foo”区分开来,那么一种方法是为“123foo”添加规范。另一种方法是将空格视为重要的。
编辑2
语法错误可以从词法分析器或语法生成或编译器的后期阶段“检测到”(想想,比如说,类型错误,它们仍然是“语法错误”)。我认为,整个编译过程的哪一部分会检测哪个错误主要是设计问题(因为它会影响错误消息的质量)。在给定的示例中,通过将“123foo”标记为无效标记来取缔“123foo”可能更有意义,而不是依赖于不存在带有数字文字后跟标识符的产生式(至少,这是gcc)。
关于c++ - 解析 C/C++ 源代码 : How are token boundaries/interactions specified in lex/yacc?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4264231/