BNFC生成的语法在最简单的示例上失败

时间:2016-05-03 22:18:55

标签: language-agnostic interpreter formal-languages bnfc

我想在haskell中编写一个解释器,用于简单的命令式语言。 为此,我首先为工具BNFC(http://bnfc.digitalgrammars.com/)编写了该语言的gramar。

该语法的一部分专用于算术表达式,例如:

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

有了这个,我可以运行BNFC工具并通过提供的脚本对其进行测试。它成功地解析算术运算。

但是,如果我添加另一部分(比方说类型):

Tint.    Type ::= "int" ;

然后放入expr secion,算术运算不再解析(当测试1 + 2时,它说“解析失败...... [这里有一些令牌]语法错误在第1行1 + 2之前”)

为什么会这样?如何解决?

改写:

为什么这样的gramar:

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

使用bnfc无法正确解析1 + 1

1 个答案:

答案 0 :(得分:0)

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

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