假设您有一种允许进行如下生产的语言: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/