1
7
完全可以解析它。尽管标识符和关键字之间存在歧义,但是lex将通过赋予关键字优先级来很高兴地处理这一问题。 我不知道还有什么问题。您不需要在解析阶段确定标识符是否有效。当您解析时,您正在构造一个解析树或一个抽象语法树(区别很细微,但与本讨论的目的无关)。之后,通过对分析过程中生成的AST进行传递,构建嵌套的符号表结构。然后再通过AST检查使用的标识符是否有效。在AST上使用一个或多个附加的解析来生成输出代码,或者其他一些中间数据结构,这样就完成了! 编辑:如果你想看看它是如何完成的,请检查Mono C编译器的源代码。这实际上是用C语言编写的,而不是C语言或C++语言,但是它确实使用了与YACC非常相似的杰伊的.NET端口。 |
2
1
一种选择是处理转发引用,只需扫描和缓存令牌,直到找到您知道如何实现的内容(类似于“紧急模式”错误恢复)。运行完thought完整文件后,请返回并尝试重新解析以前未解析的位。 至于必须手工编写lexer;不要这样做,使用lex生成一个普通的解析器,然后通过一个手工编写的填充程序从中读取,该填充程序允许您返回并从缓存中提供解析器以及lex所做的。 关于编写几个语法,在yacc文件上使用预处理器有点意思,您应该能够使它们都使用相同的原始源代码。 |