2016-05-03 121 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