假设您有一种允许这样生成的语言:optional optional = 42,其中第一个"可选"是关键字,第二个"可选"是标识符.
一方面,我希望有一个类似于Lex的规则optional { return OPTIONAL; },以后会在YACC中使用,例如:
optional : OPTIONAL identifier '=' expression ;
Run Code Online (Sandbox Code Playgroud)
如果我然后定义identifier为,说:
identifier : OPTIONAL | FIXED32 | FIXED64 | ... /* couple dozens of keywords */
| IDENTIFIER ;
Run Code Online (Sandbox Code Playgroud)
它只是感觉很糟糕...此外,我需要两种标识符,一种用于何时允许关键字作为标识符,另一种用于何时不是...
有没有习惯的方法来解决这个问题?
有一个惯用的方法来解决这个问题吗?
除了您已经找到的解决方案之外,没有。半保留关键字绝对不是 lex/yacc 语法的预期用例。
Lemon 解析器生成器有一个专为此类情况设计的后备声明,但据我所知,该有用的功能从未添加到 bison 中。
您可以使用 GLR 语法来避免找出 的所有不同子集identifier。但当然会有性能损失。
| 归档时间: |
|
| 查看次数: |
373 次 |
| 最近记录: |