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