我正在尝试使用 GOLD 解析器构建器为脚本语言创建语法,因为我想要在 C# 中输出。但是,解析器显然希望终端是唯一的。但是,终端的含义可以是上下文相关的?!考虑符号“-”。两者-x
和x-y
都是有效的,可以编写如下语法:
! -------------------------------------------------
! Terminals
! -------------------------------------------------
Opers = [+-*/]
! -------------------------------------------------
! Rules
! -------------------------------------------------
<Expression> ::= <Expression> <Operator> <Expression>
| '-' <Expression>
| <Value>
<Operator> ::= Opers
然而,现在符号“-”被定义了两次,一次是由第二个生产规则中隐含的 (!) 定义的符号,<Expression>
一次是终端(由 Opers 定义)。
最重要的是,字符串也可以包含 - 符号,添加 '-' 的第三个定义!?你如何规避这一点?我在 GOLD 的文档或网络上的任何地方都没有看到任何关于此的信息。我认为有一些我不知道的与 Parser 构建器合作的主要方式。
如果这是一个基于表的解析器无法解决的问题,我有什么替代方案,因为我想要 C# 输出?