パーサジェネレータは悩んだすえに JavaCC + jjtree を使うことにした。
この記述の冗長さはどうにかしてほしい。 なんで nonterminal にカッコつけるんだよ?! "AST" + nonterminal 名がノード名っていう jjtree のデフォルトも気に入らねえし。 nonterminal のシンボルは小文字で始めさせてくれ。
値をとるときに val =
<TERM> <TERM> <TERM> a b c
って書くのがいいと思うんだ。
LL(k) はわりと便利。 でもやっぱ演算子優先順位の処理が面倒だな。
(12:44)
~/c/stdcompiler/src % cat test1.cb
int
main(int argc, char **argv)
{
printf("Hello, World!\n");
return 0;
}
~/c/stdcompiler/src % java -classpath build/classes Compiler --dump-ast test1.cb
ToplevelNode
ListNode
ListNode
DefunNode
TypeNode
FixedParamsNode
SlotNode
TypeNode
SlotNode
TypeNode
ScopeNode
ListNode
BlockNode
FuncallNode
VariableNode
ListNode
StringLiteralNode
ReturnNode
IntegerLiteralNode
← いまココ
(16:26)
こんにちは。
> なんで nonterminal にカッコつけるんだよ?!
一応理由はあって、nonterminalの呼び出し時に引数を渡すためなんですが、
ほとんどの場合、引数なんか渡さないんだから括弧は省略させてくれよ!と
思ったことはあります。
> 二次元的に
> <TERM> <TERM> <TERM>
> a b c
> って書くのがいいと思うんだ。
これだと逆に、nonterminalの定義を変更して、TERMを追加したりしたとき、
<TERM> <NEWTERM> <TERM> <TERM>
a b c d
のようにいちいちそれにあわせて名前の位置をずらさなきゃならないという
デメリットがあるので、どっちがいいかは一概には言えないような。
書くほうの手間をとるか、読むほうの手間をとるかによるでしょうね。わたしは読みやすければちょっとくらい書く手間が増えてもいいと思います。それに、規則を変えたらどうせアクションとかも変わるんだろうし、そんなところでせせこましくタイプ量を節約してもしかたないんじゃないですか。