我想用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 secion,算术操作不再解析(在1+2上测试时,它说"Parse failed.这里的一些标记在1+2之前的第1行语法错误“)
为什么会发生这种事?怎么修呢?
重新措辞:
为什么这样的语法:
TInt. Type ::= "int" ;
EAdd. Expr ::= Expr "+" Expr ;
ENum. Expr ::= Integer ;是否使用bnfc正确解析1 + 1?
发布于 2016-06-05 14:56:01
如果没有entrypoint声明,bnfc将使用语法中定义的第一个类别作为测试脚本中的入口点。
也就是说,如果在文件顶部添加Tint. Type ::= "int" ;,bnfc生成的脚本将尝试解析Type,而不是Expr。
https://stackoverflow.com/questions/37015361
复制相似问题