「コンパイラ・スクリプトエンジン」相談室15

このエントリーをはてなブックマークに追加
908デフォルトの名無しさん:2014/05/18(日) 01:05:27.51 ID:8NF5w4j9
lexerの自動生成って必要?
ANTLRみたいなタイプならともかく、flexみたいなのって
よほど単純な言語でない限りは余計に複雑になるしデバッグもしづらくなる気がする
909デフォルトの名無しさん:2014/05/18(日) 01:14:44.51 ID:VbYhl7s+
必要ないものは使わなければいい。
parser generatorも同様。
910デフォルトの名無しさん:2014/05/18(日) 04:01:55.25 ID:EpNTbyyn
そらまあ慣れてればパーサも手書きで十分だろうけど
911デフォルトの名無しさん:2014/05/18(日) 05:18:01.09 ID:km1NGPSj
LALR手書きできるスキルがあれば…orz
912片山博文MZバグロボ ◆T6xkBnTXz7B0 :2014/05/18(日) 13:38:13.73 ID:wTsBQBni
Caperにスマートポインタサポートを追加しました。
913デフォルトの名無しさん:2014/05/18(日) 19:32:32.83 ID:3lmx3bd8
はいはいはいはーい質問でーす

処理系のVMについてですが
オペコードはスイッチ文(switch, if)で一つずつ分岐するのと
命令一つ一つを関数でつくりそれを実行するのではどちらが早いですか?
ちなみに処理系はCでできています

おながいします!
914デフォルトの名無しさん:2014/05/18(日) 19:43:06.46 ID:wTsBQBni
>>913
実測値を信じろ
915デフォルトの名無しさん:2014/05/18(日) 19:45:19.17 ID:VLKMweCv
名前どうしたw
916デフォルトの名無しさん:2014/05/18(日) 20:07:20.77 ID:3lmx3bd8
>>914
大手スクリプト言語どっちなんじゃ?
917デフォルトの名無しさん:2014/05/19(月) 01:58:06.48 ID:Si0coWpv
>>913
タイトなとこだけ展開。
昔のJITじゃないVMの読むと結構出てくる。
https://sites.google.com/site/io/dalvik-vm-internals
ちょこまかとした書き換えがすごく効く。
gotoとかloadとか小さい命令で。
918デフォルトの名無しさん:2014/05/19(月) 13:46:34.97 ID:Bh2YKOjV
>>911
LALR(1) も変形すれば LL(2) くらいにはなるので
あとは再起下降でもなんでも好きなようにすればいい
919デフォルトの名無しさん:2014/05/19(月) 16:15:14.07 ID:rN3m2Poq
(1)じゃないたいていの言語でも、たいていは(2)ぐらい、というのは真だが、
変形すればLL(2)ってことはない。
920デフォルトの名無しさん:2014/05/19(月) 20:46:03.83 ID:utepvwi4
手書きするなら左再帰に注意してLL(1)で十分だと思うよ。
921デフォルトの名無しさん:2014/05/20(火) 00:22:32.49 ID:WYH9CLBB
ていうか手書きなら自然にループとか書けるから、再帰使わなくても
<X> = a (b c)* d
みたいな拡張BNFをそのままプログラムにすると思えばいい。
922デフォルトの名無しさん:2014/05/20(火) 01:02:13.67 ID:ezmBCAPL
文法が再帰的なのにか。
923デフォルトの名無しさん:2014/05/20(火) 07:35:25.85 ID:wdE7nCB8
本質的に再帰的なのと実装の都合で再起を使ってるのは区別しようね
924デフォルトの名無しさん:2014/05/20(火) 10:40:44.97 ID:fbMM1sIr
LL (1) で足りるかどうかの方が問題なんじゃね
925デフォルトの名無しさん:2014/05/20(火) 11:38:51.42 ID:3nq9aFUp
パーザは本質的に再帰。
926デフォルトの名無しさん:2014/05/20(火) 13:53:02.72 ID:WYH9CLBB
入力の読み取りを後戻りさせたくないとか、mallocとかしたくないという昔の事情が (1) を欲しただけで、
部分的にちょっと (2) になってる、とかなら今時のマシンと言語とライブラリならたいして問題ない。

本質的に再帰になってるものとしては、式の構文とかがあるけど、普通にループで書ける。

<EXPR> : <TERM> (('+'|'-') <TERM>)*
<TERM> : <FACTOR> (('*'|'/') <FACTOR>)*
<FACTOR> : num | '(' <EXPR> ')'

<FACTOR> のルールにある、「カッコ内の<EXPR>」みたいなのを「本質的に再帰」と言う、
と言えば、まぁそうなんだけど。
927デフォルトの名無しさん:2014/05/20(火) 14:07:45.06 ID:PibgqYJG
abcとaをはんべつするときは
文字を2こ戻す必要ありますよね。
abdとかabeを弾いてaにしなければならなのですから。
928デフォルトの名無しさん:2014/05/20(火) 14:13:37.37 ID:mjphnHY1
boost.spiritはLL(∞)です。
929デフォルトの名無しさん:2014/05/20(火) 20:27:27.59 ID:3YV0fEWD
くわしく
930デフォルトの名無しさん:2014/05/21(水) 01:50:35.06 ID:aDDYIuqo
LL(*)とか言ってるのはANTLRじゃなかったっけ
なんかPLDIの論文で見たような記憶が
931デフォルトの名無しさん:2014/05/21(水) 09:18:01.98 ID:Fj6ednoX
LL(k) k:定数
932デフォルトの名無しさん:2014/05/24(土) 01:20:56.66 ID:qfxUsSTH
みんなどんな言語つくってるの?
933片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/05/29(木) 17:26:52.76 ID:XnoInNKg
ひらがな電卓、作ったよ!!!

ひらがな電卓CalcH
http://katahiromz.web.fc2.com/calch/
934デフォルトの名無しさん:2014/05/29(木) 18:52:19.98 ID:LQk3BeN6
片山博文MZさんはGithubというキーワードでぐぐると幸せになれる。
935片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/05/30(金) 12:21:16.56 ID:SSvUP3u/
GitHubはバリバリ使ってるよ。リクエストはまだないけど
936片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/01(日) 06:52:57.24 ID:CnlwSSTK
日本語は同音異義語が多い。人工言語に比べて、自然言語は多態性が問題となる。
そこでこれまで使われてきたのが形態素解析だが、
多態性が解消できれば人工言語の構文解析の手法がそのまま使える可能性が高い。
そのことをひらがな電卓で示そうと思う。
937デフォルトの名無しさん:2014/06/01(日) 08:52:19.11 ID:4IM3O9wE
お前は何を言ってるんだ
そんなもんBrainfuckのオペを日本語に置き換えたネタと変わらんわ
938デフォルトの名無しさん:2014/06/01(日) 13:03:56.67 ID:iF6nhgL2
>>936
lojban で示してくれ
生来 esiperantisto の俺も lojban に傾倒しつつある
939デフォルトの名無しさん:2014/06/01(日) 19:01:15.96 ID:r6R+kq87
日本文化には敢えて日本語の多態性をフル活用するカテゴリーがあるからねえ

自然言語から多態性を排除したモノをプログラム言語として使うというのはアリだけど
940デフォルトの名無しさん:2014/06/04(水) 11:36:58.64 ID:JjkiX3zX
各非終端記号を囲むカッコが2つ以上あるとLL文法じゃなくなるな。
941デフォルトの名無しさん:2014/06/04(水) 14:22:25.33 ID:H9m/5fkb
具体的にBNFで
942デフォルトの名無しさん:2014/06/05(木) 10:04:10.48 ID:1JqbWMwZ
B:=C|(C)
A:=B|(B)
こんな感じ?
943デフォルトの名無しさん:2014/06/05(木) 10:10:07.49 ID:1JqbWMwZ
A:=BC
B:=D|(D)
C:=E|(E)
こっちの方が分かりやすいな。
944デフォルトの名無しさん:2014/06/05(木) 10:13:32.16 ID:1JqbWMwZ
A:=B|C
B:=D|(D)
C:=E|(E)
違った。
945デフォルトの名無しさん:2014/06/05(木) 17:19:48.25 ID:bOGqmnDA
その例なら、

A := BC
BC := '(' DE ')' | DE
DE := D | E

と、くくり出せる。
946デフォルトの名無しさん:2014/06/06(金) 11:15:49.36 ID:y0bQ4ynG
なるほど。
947片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/06(金) 16:52:16.19 ID:dyn5MnFB
このスレのテンプレにCaperを追加しておくれ。
jonigataさんのパーサジェネレータCaperは充分に実用的になった。

Caper
https://github.com/jonigata/caper
948デフォルトの名無しさん:2014/06/06(金) 20:49:34.19 ID:iMYjirOz
>>947
アレは良い物ですな、つかなかなかここまで細かい事できるのに使い方が簡単なのってなかなか無いんだよね。
自分使うだけでアレだけど、MZはpullrequest結構出しててそれもとっても有り難かったです。
949デフォルトの名無しさん:2014/06/06(金) 20:57:54.81 ID:Y8WrhCVM
今作ってる言語でCaper組み込む予定だよ。
いいよね、Caper。
950片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/07(土) 19:30:42.70 ID:3R8CEA88
実行時に文法を動的に変えることできますか?
951デフォルトの名無しさん:2014/06/07(土) 20:14:40.23 ID:RFWgpx3m
主語を明示してください
952片山博文MZ悪魔崇拝 ◆T6xkBnTXz7B0 :2014/06/07(土) 20:32:42.40 ID:3R8CEA88
プログラムが実行時に解析する文法を動的に変えることできますか?
953デフォルトの名無しさん:2014/06/07(土) 20:37:06.36 ID:SxbAzKvi
eval
954デフォルトの名無しさん:2014/06/07(土) 20:44:08.32 ID:ZfdboDuT
>>952
たとえばオブジェクト指向言語であれば
Gof本のInterpreterパターンで実装することによって
「実行時に解析する文法」を動的に構成できます
関数型言語だとコンビネータやモナドを使った
構文解析器(パーザ)の動的な構成技法があります
955デフォルトの名無しさん:2014/06/07(土) 22:43:46.58 ID:3R8CEA88
>>954
わかった
ちょっとjonigataさんに相談してみる
956デフォルトの名無しさん:2014/06/08(日) 16:02:17.85 ID:3LWaPBPW
解析実行時に文法を切り替えるっていうと
Boost::Spiritでruleインスタンスを差し替えるのを先に思いついた
957jonigata
caper、動的エンジンもともともってるよ。
caperの文法ファイルは動的エンジンで起動時に文法作って読んでる。