BNFC 生成的语法在最简单的例子上失败
BNFC generated grammar fails on simplest examples
我想用 haskell 为一种简单的命令式语言编写一个解释器。
为此,我首先为工具 BNFC (http://bnfc.digitalgrammars.com/) 编写了该语言的语法。
该语法的一部分专门用于算术表达式,例如:
EAdd. Expr ::= Expr "+" Expr ;
EMinus. Expr ::= Expr "-" Expr ;
EMul. Expr ::= Expr "*" Expr ;
ENum. Expr ::= Integer ;
仅此而已,我可以 运行 BNFC 工具并通过提供的脚本对其进行测试。算术运算解析成功
但是,如果我添加另一个部分(比如类型):
Tint. Type ::= "int" ;
然后放入expr部分,算术运算不再解析(测试1 + 2时显示"Parse failed... [some tokens here] syntax error at line 1 before 1 + 2")
为什么会这样?如何解决?
改写:
为什么这样的语法:
TInt. Type ::= "int" ;
EAdd. Expr ::= Expr "+" Expr ;
ENum. Expr ::= Integer ;
使用 bnfc 无法正确解析 1 + 1
?
在没有entrypoint
声明的情况下,bnfc将使用语法中定义的第一个类别作为测试脚本的入口点。
即如果您在文件顶部添加 Tint. Type ::= "int" ;
,bnfc 生成的脚本将尝试解析 Type
,而不是 Expr
.
我想用 haskell 为一种简单的命令式语言编写一个解释器。 为此,我首先为工具 BNFC (http://bnfc.digitalgrammars.com/) 编写了该语言的语法。
该语法的一部分专门用于算术表达式,例如:
EAdd. Expr ::= Expr "+" Expr ;
EMinus. Expr ::= Expr "-" Expr ;
EMul. Expr ::= Expr "*" Expr ;
ENum. Expr ::= Integer ;
仅此而已,我可以 运行 BNFC 工具并通过提供的脚本对其进行测试。算术运算解析成功
但是,如果我添加另一个部分(比如类型):
Tint. Type ::= "int" ;
然后放入expr部分,算术运算不再解析(测试1 + 2时显示"Parse failed... [some tokens here] syntax error at line 1 before 1 + 2")
为什么会这样?如何解决?
改写:
为什么这样的语法:
TInt. Type ::= "int" ;
EAdd. Expr ::= Expr "+" Expr ;
ENum. Expr ::= Integer ;
使用 bnfc 无法正确解析 1 + 1
?
在没有entrypoint
声明的情况下,bnfc将使用语法中定义的第一个类别作为测试脚本的入口点。
即如果您在文件顶部添加 Tint. Type ::= "int" ;
,bnfc 生成的脚本将尝试解析 Type
,而不是 Expr
.