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 でもうまく解析できる。確かに決定しているのか、、、