fucc での g1, g2, g3
コンパらの構成と最適化にでてくる文法を fucc で軽く書いてみた。
(fucc:defparser *g1* s (+ - * / = :semicolon :id :const #\( #\)) ((s -> expr = :semicolon ) (expr -> expr + term -> term) (term -> term * fact -> fact) (fact -> #\( expr #\) -> :const -> :id)) ) ;-------- (fucc:defparser *g2* s (+ - * / = :semicolon :id :const #\( #\)) ((s -> expr = :semicolon ) (expr -> term (* + term)) (term -> fact (* * fact)) (fact -> #\( expr #\) -> :const) )) ;-------- (fucc:defparser *g3* s (+ - * / = :semicolon :id :const #\( #\)) ((s -> expr = :semicolon ) (expr -> term expr2) (expr2 -> + term expr2 -> - term expr2 -> ) (term -> fact term2) (term2 -> * fact term2 -> / fact term2 -> ) (fact -> #\( expr #\) -> :const -> :id)) :type :LL)
g3 だけ LL で解析している。g1 は fucc の LL では解析できないが g2 は LL でもうまく解析できる。確かに決定しているのか、、、