假设您有一种语言允许这样的生成:可选可选 = 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/