yacc & lex

1SystemXNGNG
yaccとは、"yet another compiler-compiler"(さらにもう一つのコンパイラ-コンパイラ)という意味で、
yaccの開発者である、スティーヴ・ジョンソン氏が当時(1972年頃)に存在していた同種のプログラムの多さを
皮肉った言葉に由来している。yaccはその中で生き残ったごく少数のうちの一つである。

lexはyaccがパーサーを作成するのと同様の方法で字句解析ルーチンを作る。即ち、自分の言語の字句規則の
仕様を正規表現と、その正規表現に一致する文字列が見つかった時に、実行すべきCプログラムにより記述すればよい。

lexとyaccは、我々が既に書いてきた字句解析ルーチンと同一のメカニズムで、共同して働く。

93名無しさん@お腹いっぱい。2007/06/30(土) 14:03:07
ああ、ひょっとして91が作りたかったのは
defineじゃなくてインタプリタの事じゃないだろうか?
もしそうならyaccでは不可能。
だって、yaccはCompiler Compilerだから。

94名無しさん@お腹いっぱい。2007/06/30(土) 15:08:19
(´・ω・`)

95名無しさん@お腹いっぱい。2007/06/30(土) 20:15:09

96名無しさん@お腹いっぱい。2007/07/01(日) 02:27:18

97名無しさん@お腹いっぱい。2007/07/01(日) 22:01:53
>>93
マクロ定義ができるコンパイラが作りたかったんじゃね?

98名無しさん@お腹いっぱい。2007/07/02(月) 00:15:22
(´・ω・`)

99名無しさん@お腹いっぱい。2007/07/07(土) 17:12:42
関数定義ができるコンパイラを yacc で記述するにはどうしたらいいですか?

100名無しさん@お腹いっぱい。2007/07/08(日) 10:09:07
100ゲト!
普通が一番だよ

101WNSyrttCnfyxM2007/07/19(木) 15:40:27
rAwIsK name is Kostya.My nick is Zold . I want to find friends .ICQ 324600825

102名無しさん@お腹いっぱい。2007/07/26(木) 17:55:32
antlr

103名無しさん@お腹いっぱい。2008/08/30(土) 23:01:26
BS1にチョムスキー出てた

104名無しさん@お腹いっぱい。2008/10/30(木) 23:58:54
c言語でコメント/*から*/を字句解析できないようにさせるには、
規則部にどういう正規表現をすればいいですか?

/*
・・・・・・
*/
となっています。

105名無しさん@お腹いっぱい。2008/10/31(金) 00:52:06
lex?

flexのFAQに、
How can I match C-style comments?
ってのがあるよ。

106名無しさん@お腹いっぱい。2008/10/31(金) 12:09:51
flex だったらそれでいいね。

一般的には、
非欲張り型量指定子 *? が使えるなら /\*.*?\*/ でおk

使えない場合は少々厄介で、
/\*([^*]|\*+[^/*])*\*+/

詳説正規表現の第二版だと 6.6.8.3 にある。

107名無しさん@お腹いっぱい。2008/11/01(土) 00:04:56
>>105,106
どうもありがとうございました。
大変恐縮なんですが規則部に入れるバージョンで教えてもらえないですか?
"/*"
から始まると思いますが・・・

108名無しさん@お腹いっぱい。2008/11/01(土) 00:35:06
>>105,106
lex用に直してコンパイルしましたらできました。
"/*"+[^/*]*+"*/
また教えて下さい。

109名無しさん@お腹いっぱい。2008/11/01(土) 01:56:53
ファイルからプログラムを読み込ませてそのプログラムに出てくる演算子とか
識別子の数を一番下に表示させるようにするにはどうしたらいいですか?

110名無しさん@お腹いっぱい。2008/11/01(土) 09:43:16
パーズしろ。

111名無しさん@お腹いっぱい。2008/11/01(土) 16:25:17
C言語のコメントってプリプロセッサが空白に置換するものだよ。

112名無しさん@お腹いっぱい。2008/11/02(日) 11:08:35
サーバの役割のひとつに
クライアントからの電文をプロトコルにしたがって解析して、処理し、返答を
返すという役割があるかと思います。

パーサジェネレータをつかって、簡単に上記のような枠組みを
実装するようなことはできないでしょうか。

インタプリタをパーサジェネレータを使って実装するような流れはあるのに、
drubyやerlang、アクターモデルなどの実装方法とパーサジェネレータが
なぜか結び付けられていないのが不思議に思われます。

113名無しさん@お腹いっぱい。2008/11/02(日) 11:42:33
>>112
思いて学ばざれば則ち殆うし。

114名無しさん@お腹いっぱい。2008/11/02(日) 12:25:37
>>112
つ ASN.1 ←>>112の言う方向の最後の試み
つ object serialization ←もうそれはOOの方でやっちゃいますわ

115名無しさん@お腹いっぱい。2008/11/02(日) 12:39:46
パーサジェネレータだけ知ってて状態機械知らないの?

116名無しさん@お腹いっぱい。2008/11/02(日) 17:01:54
>>114
CORBAキター

117名無しさん@お腹いっぱい。2008/11/02(日) 20:36:42
本格的な構文解析が必要な通信プロトコルを設計するのがそもそも間違いですから

118名無しさん@お腹いっぱい。2008/11/05(水) 21:20:53
>>109
おまえ信大の学生だろ。それは簡単だよ。 
コメントを読み飛ばすのは108を書けばOK

119名無しさん@お腹いっぱい。2008/11/06(木) 17:46:14
学生か
図書館にyaccの解説本の1冊ぐらいあるだろ

120名無しさん@お腹いっぱい。2008/11/07(金) 22:30:33
>>112
昔 Webアプリのプロトタイプを開発していた時に
画面遷移処理を yacc で直接的に実装した事があるよ。
入力トークンをクライアントからの要求電文に、
状態を画面(HTML)に対応させた。
Mosaic と CERN httpd の時代。

  状態1: <要求a> { 要求処理と<応答x>の返信 } 状態2
     | <要求b> { 要求処理と<応答y>の返信 } 状態3
     ;

できないのか?とか不思議?と思うのなら、自分で試すのが一番。
できれば Estelle あたりを参考に専用の言語を設計し、
Stateパターンのコードを生成する処理系を実装してみてもいい。

  from 状態1
   when <要求a> to 状態2 action 要求処理と<応答x>の返信 end;
   when <要求b> to 状態3 action 要求処理と<応答x>の返信 end;

そして、これらパーサジェネレータ志向アプローチの利点と欠点は何か、
今、なぜ普及していないのか(or これから普及していくのか)を考えよう。

121名無しさん@お腹いっぱい。2009/08/05(水) 16:46:56
cc y.tab.c -ll -o abc
Undefined symbols:
"_yylex", referenced from:
_yyparse in ccMGRLwg.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

エラーが取れない…
lexはなんとかいけたのにyaccはさっぱりだ

122名無しさん@お腹いっぱい。2009/08/05(水) 17:03:07
_yylexがない、っていうんだから、yylex()を定義すればいいんじゃないの?

123名無しさん@お腹いっぱい。2009/08/05(水) 17:27:41
なんとか121はこえたのでパースエラーと戦ってくる
>>122ありがとう

124名無しさん@お腹いっぱい。2010/11/11(木) 15:15:36
Cのラベルみたいなもの

任意の文字列 最後に特殊文字(:とか)

はlex側でなくてyacc側で認識させるものなの?

125名無しさん@お腹いっぱい。2010/11/11(木) 15:20:20
labelname ':'

とyaccで扱うのが普通じゃないか?

126名無しさん@お腹いっぱい。2010/11/11(木) 17:01:03
ケースバイケースだと思うけど。

C 言語の場合、
a ? b : c;
の一部という場合があるので、<識別子> ":" を、lex で無条件に <ラベル> にするわけにはいかない。

127名無しさん@お腹いっぱい。2010/11/17(水) 11:36:58
>>91
>>93

いやyacc, lexを使ってインタープリターは作れる。

GUIのテストをするための、カーソル移動、マウスクリックの
シミュレートをするプログラムを作ったことがあり、
インタラクティブに画面上の移動、パスの記録などを
できるようにしたことがある。

マニュアルをよく読めば見当がつくはず。yylexだっけ、インプットストリームの
切り替え部分に気をつければずっと読み込みをしながら、
一行コマンドラインの処理をしつつ、エラーの処理もyaccで行なって
インタープリターはつくれますよ。
(あ、一行でコマンドが終わるとするとかなり楽になる。
セミコロンみたいな シンボルが来るまで終わらないというのはちょっと
うれしくない。一行でコマンドが終わって、どうしても必要なら行末の
バックスラッシュで継続行とかするのがよい。)

インタープリターで対話的に作ったスクリプトを、再度編集しなおして
標準入力から放り込めば、GUIプログラムのパッケージの
テストができるというものでした。

128名無しさん@お腹いっぱい。2010/11/30(火) 15:31:10
BNFCもいいな

129名無しさん@お腹いっぱい。2010/12/10(金) 10:56:06
命令文2つを1つに変換したい

statmnt1 argX argY
statmnt2 argY



statmntA argX argY

にしたい。
argYが一致しない場合は
statmnt1  → statmntA2
statmnt2 → statmntB

にしたい。しかしうまい書き方が思いつかない

スレの趣旨がわからん

131名無しさん@お腹いっぱい。2013/06/01(土) 16:18:40.79
質問です。
http://www.w3.org/TR/CSS21/grammar.html
このページでYACCの文法が載ってますが、拡張されているのでそのまま
使えません。この中で、

expr
: term [ operator? term ]*

はどうやってYACC文法で書けばいいでしょうか?

132名無しさん@お腹いっぱい。2013/06/01(土) 19:22:48.72
一般にA*は、
X =
X = A | X
A?は、
X =
X = A
と定義したXで置き換えられる。

133名無しさん@お腹いっぱい。2013/06/01(土) 22:32:34.47
その後>>132のいうように分割して定義する事がわかったので、そうして
定義していますが、複雑になるとかなり分割数が増えるので面倒ですね…

134名無しさん@お腹いっぱい。2013/06/02(日) 09:21:11.71
めんどうだから拡張されてるんじゃないの。

135名無しさん@お腹いっぱい。2013/06/02(日) 14:59:49.67
http://www.w3.org/TR/CSS21/grammar.html
このYACC文法がそのまま入力出来るツールがあってほしいね。

136名無しさん@お腹いっぱい。2013/06/03(月) 01:08:35.25
文法は違うけど、
parsec辺りは拡張BNFがOKで、
自然な記述でアクションも定義できる。

137名無しさん@お腹いっぱい。2013/06/04(火) 19:07:57.43
>>135
> http://www.w3.org/TR/CSS21/grammar.html
ラッパ作りゃいいんじゃね?

138名無しさん@お腹いっぱい。2013/06/05(水) 21:48:31.36
コンパイラコンパイラのコンパイラコンパイラになるのか?

139名無しさん@お腹いっぱい。2016/01/20(水) 01:28:56.56
Yet Another Compiler Compiler Compiler

140名無しさん@お腹いっぱい。2017/03/19(日) 19:56:12.87
コンパイラコンパイラのように、OSの仕様を記述すればそれでOSがたちまち
できてくるというようなツールはあるの?

141名無しさん@お腹いっぱい。2017/12/29(金) 09:42:38.56
誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。

グーグル検索⇒『宮本のゴウリエセレレ』

QU1SBJJIM5

142名無しさん@お腹いっぱい。2018/05/22(火) 04:23:17.03
知り合いから教えてもらったパソコン一台でお金持ちになれるやり方
時間がある方はみてもいいかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

74Q1F

143名無しさん@お腹いっぱい。2018/09/27(木) 19:17:33.25
lex&yacc
flex&bison

新着レスの表示
レスを投稿する