Skip to content
kik edited this page Sep 13, 2010 · 2 revisions

完全な例

sample-1

S式みたいなのの構文解析を行うサンプル

expr ::= int_lit | token('(') op expr expr token(')')
int_lit ::= token(int_lit_s)
op ::= token(op_s)
int_lit_s ::= digit+
op_s ::= alpha+
token(T) ::= T ws*

token(T) はジェネリックなルールで後ろについた空白文字を食べる。

sample-2

actionを定義しなくても、boost::fusion::vector<T1, T2, T3, …>ならそのまま作ってくれるよサンプル。

sample-3

普通の式の構文解析を行うサンプル。よくある左再起を除去した規則をジェネリックに書いてみる


start ::= expr
primary_expr ::= int_lit | '(' expr ')'
multi_expr ::= left_assoc_expr(primary_expr, '*' | '/')
expr ::= left_assoc_expr(multi_expr, '+'|'-')
left_assoc_expr(T, Op) ::= T (Op T)*

空白の除去の規則は省略。

sample-4

sample-3をASTを生成するように変更したもの

Clone this wiki locally