parsing - 您如何处理 Lex 中的关键字?

标签 parsing yacc lex

假设您有一种语言允许这样的生成:可选可选 = 42,其中第一个“可选”是关键字,第二个“可选”是标识符。

一方面,我想要一个 Lex 规则,例如 optical { return OPTIONAL; },稍后将在 YACC 中使用,例如:

optional : OPTIONAL identifier '=' expression ;

如果我将标识符定义为:

identifier : OPTIONAL | FIXED32 | FIXED64 | ... /* couple dozens of keywords */ 
    | IDENTIFIER ;

感觉很糟糕...此外,我需要两种标识符,一种用于允许关键字作为标识符的情况,另一种用于不允许关键字作为标识符的情况...

有解决这个问题的惯用方法吗?

最佳答案

Is there an idiomatic way to solve this?

除了您已经找到的解决方案之外,没有。半保留关键字绝对不是 lex/yacc 语法的预期用例。

柠檬解析器生成器有一个专为此类情况设计的后备声明,但据我所知,该有用的功能从未添加到 bison 中。

您可以使用 GLR 语法来避免找出标识符的所有不同子集。但当然会有性能损失。

关于parsing - 您如何处理 Lex 中的关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49608872/

相关文章:

mysql - 在 SQL 中查询 JSON 字符串

c++ - 将 Yacc/Bison 解析器与 C++ 程序连接

parsing - 执行语义操作时 Ocamlyacc token 不可见

c - Lex:仅由其他单词的字母组成的最长单词

c - Flex 默认规则

parsing - 解决表达式语法中的移位/归约冲突

java - 在 Java 中处理对于 int 来说太大的数字

c - 语法中的左递归会导致冲突

c++ - 为什么程序不返回 YYText() 或 YYLeng()?

json - 使用 EVReflection 进行非常缓慢的 JSON 解析,具体取决于 iOS 设备