0

我正在学习如何编写解析器,为此,我正在为 SQL 编写解析器。

我正在写的语法是由 perl Parse::Eyapp模块处理的,它与标准的 yacc 非常相似。

当我添加对单操作数运算符的支持(不确定什么是正确的名称 - 运算符,如 12! 或 @@ 'value')时,将语法编译为 perl 时,我得到:

14 shift/reduce conflicts

我之前也有过,但我通过添加适当的 %left 和 %right 解决了这个问题,但这次我不知所措,因为问题似乎来自 1 操作数运算符和更传统的 2 操作数运算符之间的冲突。

完整的语法太长了,放在这里,所以我只是链接到它

要编译它,我使用命令:

eyapp -m Pg::SQL::Parser::SQL -o SQL.pm SQL.eyp

在启用详细信息的情况下运行eyapp ...时,我得到了这个输出

所以,问题是:如何解决这里的问题?

4

1 回答 1

1

啊。看来我误诊了问题。问题的真正原因不是一元运算符,而是强制转换 (expr '::' normal_type)。

在优先级配置的末尾添加 %left '::' 解决了这个问题。

如果你好奇 -提交链接

于 2012-09-05T12:33:23.990 回答