lexerの自動生成って必要?
ANTLRみたいなタイプならともかく、flexみたいなのって
よほど単純な言語でない限りは余計に複雑になるしデバッグもしづらくなる気がする
必要ないものは使わなければいい。
parser generatorも同様。
そらまあ慣れてればパーサも手書きで十分だろうけど
LALR手書きできるスキルがあれば…orz
Caperにスマートポインタサポートを追加しました。
913 :
デフォルトの名無しさん:2014/05/18(日) 19:32:32.83 ID:3lmx3bd8
はいはいはいはーい質問でーす
処理系のVMについてですが
オペコードはスイッチ文(switch, if)で一つずつ分岐するのと
命令一つ一つを関数でつくりそれを実行するのではどちらが早いですか?
ちなみに処理系はCでできています
おながいします!
名前どうしたw
916 :
デフォルトの名無しさん:2014/05/18(日) 20:07:20.77 ID:3lmx3bd8
>>911 LALR(1) も変形すれば LL(2) くらいにはなるので
あとは再起下降でもなんでも好きなようにすればいい
(1)じゃないたいていの言語でも、たいていは(2)ぐらい、というのは真だが、
変形すればLL(2)ってことはない。
手書きするなら左再帰に注意してLL(1)で十分だと思うよ。
ていうか手書きなら自然にループとか書けるから、再帰使わなくても
<X> = a (b c)* d
みたいな拡張BNFをそのままプログラムにすると思えばいい。
文法が再帰的なのにか。
本質的に再帰的なのと実装の都合で再起を使ってるのは区別しようね
LL (1) で足りるかどうかの方が問題なんじゃね
パーザは本質的に再帰。
入力の読み取りを後戻りさせたくないとか、mallocとかしたくないという昔の事情が (1) を欲しただけで、
部分的にちょっと (2) になってる、とかなら今時のマシンと言語とライブラリならたいして問題ない。
本質的に再帰になってるものとしては、式の構文とかがあるけど、普通にループで書ける。
<EXPR> : <TERM> (('+'|'-') <TERM>)*
<TERM> : <FACTOR> (('*'|'/') <FACTOR>)*
<FACTOR> : num | '(' <EXPR> ')'
<FACTOR> のルールにある、「カッコ内の<EXPR>」みたいなのを「本質的に再帰」と言う、
と言えば、まぁそうなんだけど。
abcとaをはんべつするときは
文字を2こ戻す必要ありますよね。
abdとかabeを弾いてaにしなければならなのですから。
boost.spiritはLL(∞)です。
くわしく
LL(*)とか言ってるのはANTLRじゃなかったっけ
なんかPLDIの論文で見たような記憶が
LL(k) k:定数
みんなどんな言語つくってるの?
片山博文MZさんはGithubというキーワードでぐぐると幸せになれる。
GitHubはバリバリ使ってるよ。リクエストはまだないけど
936 :
片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/01(日) 06:52:57.24 ID:CnlwSSTK
日本語は同音異義語が多い。人工言語に比べて、自然言語は多態性が問題となる。
そこでこれまで使われてきたのが形態素解析だが、
多態性が解消できれば人工言語の構文解析の手法がそのまま使える可能性が高い。
そのことをひらがな電卓で示そうと思う。
お前は何を言ってるんだ
そんなもんBrainfuckのオペを日本語に置き換えたネタと変わらんわ
>>936 lojban で示してくれ
生来 esiperantisto の俺も lojban に傾倒しつつある
日本文化には敢えて日本語の多態性をフル活用するカテゴリーがあるからねえ
自然言語から多態性を排除したモノをプログラム言語として使うというのはアリだけど
各非終端記号を囲むカッコが2つ以上あるとLL文法じゃなくなるな。
具体的にBNFで
B:=C|(C)
A:=B|(B)
こんな感じ?
A:=BC
B:=D|(D)
C:=E|(E)
こっちの方が分かりやすいな。
A:=B|C
B:=D|(D)
C:=E|(E)
違った。
その例なら、
A := BC
BC := '(' DE ')' | DE
DE := D | E
と、くくり出せる。
なるほど。
>>947 アレは良い物ですな、つかなかなかここまで細かい事できるのに使い方が簡単なのってなかなか無いんだよね。
自分使うだけでアレだけど、MZはpullrequest結構出しててそれもとっても有り難かったです。
今作ってる言語でCaper組み込む予定だよ。
いいよね、Caper。
950 :
片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/07(土) 19:30:42.70 ID:3R8CEA88
実行時に文法を動的に変えることできますか?
主語を明示してください
プログラムが実行時に解析する文法を動的に変えることできますか?
eval
>>952 たとえばオブジェクト指向言語であれば
Gof本のInterpreterパターンで実装することによって
「実行時に解析する文法」を動的に構成できます
関数型言語だとコンビネータやモナドを使った
構文解析器(パーザ)の動的な構成技法があります
>>954 わかった
ちょっとjonigataさんに相談してみる
解析実行時に文法を切り替えるっていうと
Boost::Spiritでruleインスタンスを差し替えるのを先に思いついた
957 :
jonigata:
caper、動的エンジンもともともってるよ。
caperの文法ファイルは動的エンジンで起動時に文法作って読んでる。