Rytlの生成規則
program ::= stmt*
stmt ::= expr ";"
";"はいらない
expr ::= assign
assign ::= equality ("=" assign)?
これあってるか?型的に無理じゃね?
"="の左辺にはExprではなくStringが来て欲しい
equality ::= relational ("==" relational | "!=" relatoinal) *
relational ::= add ("<" add | "<=" add | ">" add | ">=" add)*
add ::= term | expr ("+" | "-") term
これあってる??????????
term ::= unary | unary ("*" term | "/" term )
これあってる??????????
unary ::= factor | ("+" | "-") factor
hccでは-tはSub 0 tとすることで、codeGenには手を加えずに実装している factor ::= nat | ident | "(" expr ")"
nat ::= 0|1|2|3|4|5|6|7|8|9
これらの非終端記号一つ一つを一つ一つの関数にマップしていく
型はTokens→Ast
上の生成規則、再帰を使うか、繰り返し*を使うかで実装方法がやや異なる
Haskellの場合、再帰のほうが書きやすそうだが、
Cの場合は繰り返しのほうが書きやすそう
Array
<exp>[exp]
hoge[1+1]
つまり[1,2,3][1+1]みたいな式があったとき、
[1,2,3]と1+1は式
二番目の[は中置演算子