generated at
Rytlの生成規則
from Rytl

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]
monkey-nimでは [ をinfixOpとしてparseする
つまり [1,2,3][1+1] みたいな式があったとき、
[1,2,3] 1+1 は式
二番目の [ は中置演算子