我想在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
答案 0 :(得分:0)
如果没有entrypoint
声明,bnfc将使用语法中定义的第一个类别作为测试脚本中的入口点。
即。如果您在文件顶部添加Tint. Type ::= "int" ;
,bnfc生成的脚本将尝试解析Type
,而不是Expr
。