假设您有一种允许进行如下生产的语言:optional optional = 42,其中第一个“optional”是关键字,第二个“optional”是标识符。

一方面,我想拥有一个像optional { return OPTIONAL; }这样的Lex规则,稍后将在YACC中使用,例如:

optional : OPTIONAL identifier '=' expression ;

如果再将identifier定义为,请说:
identifier : OPTIONAL | FIXED32 | FIXED64 | ... /* couple dozens of keywords */
    | IDENTIFIER ;

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

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

最佳答案



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

Lemon解析器生成器具有一个针对此类情况的后备声明,但是据我所知,有用的功能从未被添加到bison中。

您可以使用GLR语法来避免必须找出identifier的所有不同子集。但是当然会有性能上的损失。

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

10-15 01:58