我正在尝试使用GOLD解析器构建器为脚本语言创建语法,因为我希望在C#中输出。但是,解析器显然希望终端是唯一的。但是,终端的含义可能是上下文敏感的?!考虑符号' - '。 -x
和x-y
都有效,可以按如下方式编写语法:
! -------------------------------------------------
! Terminals
! -------------------------------------------------
Opers = [+-*/]
! -------------------------------------------------
! Rules
! -------------------------------------------------
<Expression> ::= <Expression> <Operator> <Expression>
| '-' <Expression>
| <Value>
<Operator> ::= Opers
但是,现在符号' - '被定义两次,一次由<Expression>
的第二个生成规则中的隐含(!)定义的符号定义,一次作为终结符(由Opers定义)。
最重要的是,一个字符串可以包含 - 符号,并添加第三个' - '的定义!你怎么绕过这个?我在GOLD文档或网络上的任何地方都没有看到有关此内容的任何信息。我认为与Parser构建器有一些主要的合作方式,我不知道。
如果这是一个无法使用基于表格的解析器解决的问题,我有哪些替代方法,因为我想要C#输出?
答案 0 :(得分:0)
错误是因为-< EXPRESSION>
与运算符冲突,将负值放入这样的值:
< value> ::= int|'-'< value>