2016-05-03 78 views
0

我想在一个简单的命令式语言中编写一个在haskell中的解释器。 为此,我首先为该工具BNFC编写了该语言的Gramar(http://bnfc.digitalgrammars.com/)。该语法BNFC生成的语法在最简单的例子上失败

部分专门算术表达式,如:

EAdd.  Expr ::= Expr "+" Expr ; 
EMinus. Expr ::= Expr "-" Expr ; 
EMul.  Expr ::= Expr "*" Expr ; 
ENum.  Expr ::= Integer ; 

刚走,我可以运行BNFC工具,并提供脚本来进行测试。它成功解析算术运算。

不过,如果我添加其他部分(让我们与类型说):

Tint. Type ::= "int" ; 

,然后把EXPR secion,算术运算不再解析(1 + 2它说,在测试时“解析失败。 .. [一些标记在这里]在1 + 2之前的第1行的语法错误“)

为什么会发生?如何解决它?

改变措辞:

TInt. Type ::= "int" ; 
EAdd. Expr ::= Expr "+" Expr ; 
ENum. Expr ::= Integer ; 

不能正确分析1 + 1使用BNFC:为什么这么gramar

回答

0

如果没有entrypoint声明,bnfc将使用语法中定义的第一个类别作为测试脚本中的入口点。

I.e.如果您在文件顶部添加Tint. Type ::= "int" ;,由bnfc生成的脚本将尝试解析Type,而不是Expr