字句解析/構文解析/ASTの生成までをやってくれるフレームワークBNFCを試してみた
BNF構文を書くだけで字句解析/構文解析/ASTの生成までをやってくれるらしい。
- 検証環境Debian11(bullseye)
$ sudo apt-get install haskell-stack
$ stack install BNFC
- PATH=$PATH:~/.local/bin にパスを通しておく
BNFCを呼び出す
- バージョンが出れば成功
$ bnfc --version
2.9.2
- C++でlexer/parser/astを出力するには
$ bnfc -m -c FILE.cf # to generate C
$ bnfc -m -cpp_stl FILE.cf # to generate C++ with STL
計算機
以下のファイルを用意する
Calc.cf
EAdd. Exp ::= Exp "+" Exp1 ;
ESub. Exp ::= Exp "-" Exp1 ;
EMul. Exp1 ::= Exp1 "*" Exp2 ;
EDiv. Exp1 ::= Exp1 "/" Exp2 ;
EInt. Exp2 ::= Integer ;
coercions Exp 2 ;
コンパイル
$ bnfc -m -cpp_stl Calc.cf
$ make
お試し
$ echo "23 + 4 * 70" | ./TestCalc
Parse Successful!
[Abstract Syntax]
(EAdd (EInt 23) (EMul (EInt 4) (EInt 70)))
[Linearized Tree]
23 + 4 * 70
やるじゃん