パーサジェネレータは悩んだすえに 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)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
こんにちは。
> なんで nonterminal にカッコつけるんだよ?!
一応理由はあって、nonterminalの呼び出し時に引数を渡すためなんですが、
ほとんどの場合、引数なんか渡さないんだから括弧は省略させてくれよ!と
思ったことはあります。
> 二次元的に
> <TERM> <TERM> <TERM>
> a b c
> って書くのがいいと思うんだ。
これだと逆に、nonterminalの定義を変更して、TERMを追加したりしたとき、
<TERM> <NEWTERM> <TERM> <TERM>
a b c d
のようにいちいちそれにあわせて名前の位置をずらさなきゃならないという
デメリットがあるので、どっちがいいかは一概には言えないような。
書くほうの手間をとるか、読むほうの手間をとるかによるでしょうね。わたしは読みやすければちょっとくらい書く手間が増えてもいいと思います。それに、規則を変えたらどうせアクションとかも変わるんだろうし、そんなところでせせこましくタイプ量を節約してもしかたないんじゃないですか。