C と Ruby との大きな違い. 再掲 : if-then-else 再掲 : 最初. コンパイラ理論 13 Racc その 8 ( コード出力 ) コード生成をしてみよう. といっても 時間がないので Ruby-likeなプログラムを出力してみよう 櫻井彰人

Relaterede dokumenter
result = val[0][0], val[1][1], val[0][0], val[2], val[4]))

Forretning Brev Brev - Adresse Dansk Mr. J. Rhodes Rhodes & Rhodes Corp. 212 Silverback Drive California Springs CA Amerikansk adresse format: M

Australsk addresse format: Vejnummer + vejnavn Provins Bynavn + postnummer Miss L. Marshall Aquatechnics Ltd. 745 King Street West End Wellington 0680

ISO/IEC/EN 機能安全規格認証のためのモデルベースデザイン

リリース ノート. intra-mart EX 申請システム Version.5.4 PDF オプションは以下の製品上で動作します 動作環境については 以下の製品のリリース ノートを参照してください

デンマーク 語 単 語 基 本 表 現. 今 日 は/やあ Goddag/Hej. ごきげんいかがですか Hvordan har du det? はじめまして Rart at møde Dem. Jeg hedder Sato. Jeg er fra Japan.

Akiyo Nakamoto Nanae Ikeda Sachie Arai. Ryota Kitao Hiromi Morioka Masako Yamanaka Junko Yamanaka

DC/DC Converter Application Information

HealthInsuranceandtheHealthSafetyNet:

Fujitsu Server PRIMEQUEST シリーズ irmc S5 RESTful API

Systemwalker テンプレート [ イベント監視 ] 対応製品一覧 [ 最新版数 :3.7] [ 公開日 :2019/3/22]

Personlig hilsen hilsen - ægteskab Japansk おめでとうございます 末永くお幸せに Brugt til at lykønske et nygift par Dansk Tillykke. Vi ønsker jer begge to alt mulig glæ

VERSYS FIBER METAL MIDCOAT 6 DEGREE REDUCED TAPER NECK 手術手技

Laos. ILLUSTRERET REJSEDAGBOG Del. 22.APR Huay Xai, 40 C. 24.APR Luang Prabang, 39 C. Navisa & Ohji

FUJITSU Software ServerView Suite V U

ESMPRO/ServerManager Ver.6 ユーザーズガイドコマンドラインインターフェース

ComparativeosteologybetweenDiomedea,PhoebastriaandThalasarche (albatrosesformerlysetledin Diomedea )


National Institute of Technology, Ibaraki College

Webside score abcrentacar.co.jp

Dansk Byggeri Inspiration til CSR. Dansk Byggeri nov 2009

No. ࡀ ࠕ ᴺ ዪ ࡀ ࠕ ⴕ Ͽ㨀ൻ ᩏ ႎ๔ᦠ 㧔ⷐ 㧕 ᐔᚑ 19 ᐕ 3 㧔2007 ᐕ㧕 ⴕ ᴺ 㓙දജᯏ 㧔JICA㧕 ᆔ వ ᑼળ JR ን ㅢ ᑼળ


The Semiconductor Lifecycle Solution Renesas Solutions. ルネサス認定の製造中止品正規代理店

Velkommen til Maabjerg BioHeat & Power Maabjergværket ようこそ当発電所にいらしゃいました

Ꮏ ᝄ ዪ ᣇਛዊડ ᝄ ᐲߩ ᩏ ᦨ ႎ๔ᦠ ᐔᚑ 23 ᐕ 8 㧔2011 ᐕ ⴕ ᴺ 㓙දജᯏ 㧔JICA㧕 ᑼળ

Level B. int rpr t ( 名 ) interpretation 解釈 / interpreter 通訳 interpret an unfamiliar gesture なじみのないジェスチャーを解釈する. 2. interpret ( 他 ) ~を解釈する

本 語 彙 集 の 見 方 2. 略 号 [ 名 ] 名 詞 [ 名 単 ] 名 詞 単 数 形 のみ [ 名 複 ] 名 詞 複 数 形 のみ [ 固 ] 固 有 名 詞 [ 代 ] 代 名 詞 [ 数 ] 数 詞

LaterelapseafterSVRtoPEG-IFNalphaplusRBV 277. CaseReport

2009/10/19. Overview of JJY

Cup Holder STOKKE XPLORY UK DE DK ES FR IT JP KR NL

Rejse Helbred Helbred - Nødsituation Tjekkisk Potřebuji do nemocnice. At spørge efter at blive bragt på sygehuset Japansk 病院に連れて行ってください Je mi špatně.

KO - 한국어 PL - POLSKI

PERKO 社型式別輸入部品リスト モデル番号 製造元 型式 商品名 米国価格 PERKO DP199A Liner-RodHldr Lip \1,978 On PERKO 0024DP1 Socket-Bulb Dbl Cont \1,

FireGlobe fireplace Ø 64 cm. Læs før brug Bitte zuerst lesen Read before use Léase antes de usar Lire avant usage 使用する前に読んでください

腹部大動脈瘤ステントグラフト手術の初期 中期成績 : 術後瘤径変化の予測は可能か?

English and Danish draft translations of Uchimura Kanzō s A Story of Denmark (1911)

Fig. 1: Generation of attractors by threshold perturbation control. Fig. 2: Controlling chaos by threshold perturbation control

SVENSKA Då det finns många olika golvmaterial, medföljer ej fästskruvar. För rekommendation om lämpliga skruvsystem, kontakta en lokal fackhandlare.

取付方法 (JP) 人工呼吸器搭載台取付方法 Rev

広島大学学術情報リポジトリ Hiroshima University Institutional Repository

4025 Chrome Series 4X21FP

RemedialEnglishLessons: UsingaMonolingualEnglishDictionary 英英辞典を利用し 英語嫌いを改善する授業の工夫

Chrome SLT X23E

Spark 2.0 介绍 : 从 RDD API 迁移到 DataSet API Spark 大数据博客 -

Referat fra DKFN Stiftende Generalforsamling, Dansk

綠 表 申 請 者 經 由 電 腦 根 據 攪 珠 結 果 隨 機 排 列 的 次 序

Brugsvejledning - 8 -

MING-CHANG LEE. Department of Information Management Yu Da College of Business. December 6, 2006

Moda 275C5. DA Brugervejledning 1 Kundeservice og garanti 24 Fejlfinding og FAQ 29

Beoplay H9 3rd Gen. Quick Start Guide Lynguide Kurzanleitung Guía de inicio rápido Guide de démarrage rapide Guida di avvio rapido クイックスタートガイド빠른시작가이드

Bestyrelsen tildeler ligesom sidste år rejse-stipendier til to udvekslingsstudenter i Stipendiet er på kr. til hver.

利用 在 面蓝宝石上生长的 何 涛 陈 耀 李 辉 戴隆贵 王小丽 徐培强 王文新 陈 弘 中国科学院物理研究所凝聚态国家重点实验室 北京 :

Bluetooth HID Module. [ HID Keyboard ] 使用手冊 HL-MD08R-C2-HK. Bluetooth V2.1+EDR Ver

Based on the ballot result, the order randomly generated by computer for White Form Applicants is as follows

22

Ms. Celia Jones TZ Motors 47 Herbert Street Floreat Perth WA 6018 澳大利亚地址格式 : 收信人公司名街道号码 + 街道名省名城市名 + 邮编 Miss L. Marshall Aquatechnics Ltd. 745 King St

S221C4. DA Brugervejledning 1 Kundeservice og garanti 29 Fejlfinding og FAQ 34

StorageTek Virtual Library Extension

S221C3. DA Brugervejledning 1 Kundeservice og garanti 29 Fejlfinding og FAQ 34

Driftsvejledning PRODUKTNAVN. Køletørrer MODEL. Originalinstruktioner IDFA100F-38-, IDFA100F-40- IDFA125F-38-, IDFA125F-40- IDFA150F-38-, IDFA150F-40-

Webside score img.chkaja.com

SX PRO SE Bruksanvisning DK BruGsanvisning No Bruksanvisning FI Käyttöohje GB Instruction manual CZ návod k použití

IBM Software Group IBM 自动化测试框架. 李剑波 IBM Rational 技术顾问

Driftsvejledning IDFA3E-23-A,C IDFA4E-23-A,C,L,R,T,V IDFA6E-23-A,C,K,L,R,T,V IDFA8E-23-A,C,K,L,R,T,V IDFA11E-23-A,C,K,L,R,T,V IDFA15E-23-C,K,L,R,T,V

TOLV. Owner s Manual. Sudio Tolv, True Wireless Earphones

3-DRAWER DRESSER ITEM # 1M3D. Oeuf LLC 119 8th Street, Suite 301 Brooklyn, NY USA +1 (718) ek66017.

Operator s Manual. CP7782 Series Air Impact Wrench WARNING

VERTICAL MINI LIBRARY

デンマークの住宅タイプと社会住宅の経営管理の特徴に関する研究

AC3259. EN User manual 1 ZH-T 使用手冊 19 G H I J K L M Koninklijke Philips N.V. All rights reserved.

Beoplay H8i. User Guide Betjeningsvejledning Bedienungsanleitung Guía del usuario Mode d emploi Guida utente ユーザーガイド사용설명서

Forældreinformationsbrev November14.

Lenovo TAB 7. Brugervejledning. Lenovo TB-7504F Lenovo TB-7504X

Instruktion & Garanti

AC3259. EN User manual 1 ZH-T 使用手冊 19 H I J K L M N Koninklijke Philips N.V. All rights reserved.

GE Healthcare ML6-15 Waterpath Bracket. Reference Guide

Bemærkninger om lovgivning, sikkerhed og miljø BRUGERVEJLEDNING

IBM Rational Quality Manager

2 /3 (M1 M2 M3) ( RS-485);PLC program

文件 - 个人信息 Hvad hedder du? 询问某人的名字 Hvad hedder du? Hvor og hvornår er du født? Hvor og hvornår er 询问某人的出生日期和地点 du født Hvor bor du? 询问某人住在哪里 Hvad er di

1 2 AC2889. AC2889: connected version. EN User manual 1 ZH-T 使用手冊 19 A B E F G H Koninklijke Philips N.V. All rights reserved.

Tillykke med jeres forlovelse. Tillykke Har med I jeres besluttet forlove je for en dato endnu? dato endnu? 用于恭喜你很熟悉的最近刚订婚的夫妇并询问婚礼何时举行 祝福 - 生日和纪念日 Fød

Lenovo TAB4 10 Plus. Brugervejledning. Lenovo TB-X704F Lenovo TB-X704L Lenovo TB-X704Y

I A G L O R. Nyhedsbladet Gloria 5. juli 2016 Brugerdrevet nyhedsbrev Socialpsykiatrisk Center Nord-Vest

KLAR. Owner s Manual. Active Noise Cancelling Headphones

276E7. DA Brugervejledning 1. Kundeservice og garanti 23. Fejlfinding og FAQ 29

227E7 237E7. DA Brugervejledning 1 Kundeservice og garanti 23 Fejlfinding og FAQ 28

Computer Networks v4 cs.sjtu 第 9 章 无线网络 系统互联 无线局域网 无线广域网. ftp://ftp.cs.sjtu.edu.cn/net330 第 9 章无线网络 1 / 196

225C5. DA Brugervejledning 1 Kundeservice og garanti 29 Fejlfinding og FAQ 34

276E6. DA Brugervejledning 1. Kundeservice og garanti 22. Fejlfinding og FAQ 28

BDM3275UP. DA Brugervejledning 1 Kundeservice og garanti 28 Fejlfinding og FAQ 33

Frederiksborg Amt] Uwe [ u:v ] ウーヴェ [ 男子名 ]

ÅRSREGNSKAB for Trandum Sogns Menighedsråd. i Holstebro Provsti. i Holstebro Kommune. Myndighedskode CVR-nr

Ms. Celia Jones TZ Motors 47 Herbert Street Floreat Perth WA 6018 澳大利亚地址格式 : 收信人公司名街道号码 + 街道名省名城市名 + 邮编 Miss L. Marshall Aquatechnics Ltd. 745 King St

Quick start guide Guide de mise en route. Bamboo Ink

DUSTER. Ph2 11/ /07/2013 1/ A

Lagerman [ ladj man ] レーヤマン [ 姓 ] Lading [ la e ] ラズィング [ 姓 ],[ 地名 : 町 / 教区 :Lading Sogn: Hammel Kommune: Århus Amt]

YOGA BOOK with Windows

HP DesignJet T900- og T1500-printerserien. Juridiske oplysninger

Transkript:

内容 櫻井彰人 コンパイラ理論 13 Racc その 8 ( コード出力 ) コード生成をしてみよう といっても 時間がないので Ruby-likeなプログラムを出力してみよう 何をやっているのかわからないといわれそうですが ちょっと直すと C に似た言語で出力できますよ (Cは本質的には無理です 次頁) それにもまして 練習になります C と Ruby との大きな違い C は 変数に型がある データには型がない ( 定数には型がある ) vs. Ruby は 変数には型がない データには型がある そのため C には型宣言が必要であるが Ruby には型宣言が必要ない Ruby から C に変換するには 型宣言を変換プログラムが導入しないといけないが これは ほぼ 不可能 方針 構文木を作成してからコード生成を行う Ruby-like なコードを出すだけなら 構文木に変換してからコード出力をする必要はない 今回は 練習のため 再掲 : 最初 program : stmt_list result = RootNode.new( val[0] ) stmt_list : result = [] stmt_list stmt EOL result.push val[1] stmt_list EOL これは 前述 ( ではなく次頁 ) のように 修正する ルートノード ( 木の根 ) を作る ノードの種類をいくつかつくり それごとに メソッドを定義している それより細かい区分は 引数で行う 行の終わりを示す非終端記号 結果は配列に入れる 再掲 : if-then- if_stmt : IF stmt THEN stmt_list _stmt END result = IfNode.new( @fname, val[0][0], val[1], val[3], val[4] ) _stmt : ELSE stmt_list result = val[3] result = nil stmt_list : result = [] stmt result=[val[0]] stmt_list EOL stmt result.push val[2] stmt_list EOL

根っこ class RootNode < Node def initialize(tree) super nil, nil @tree = tree def evaluate exec_list Core.new, @tree 親クラス "new" のときに 実行される 親クラス Node のメソッドを使用する def mimic mimic_list Core.new, @tree 使い方から分かるように 子木の配列が渡される インスタンス変数に記憶する インタプリタ動作用 今回は 各子ノードで必ず定義する コード生成が目的なら ここをコード生成にする 大親 Node class Node def initialize(fname, lineno) @filename = fname @lineno = lineno attr_reader :filename attr_reader :lineno def mimic_list(intp, nodes) nodes.each i i.mimic(intp); print(" n") http://ruby.kyoto-wu.ac.jp/documents/ruby-man-ja/ruby_faq.html の 5.6 を参照 n = Node.new('intp', 1) puts n.filename, n.lineno などとできる def exec_list(intp, nodes) v = nil nodes.each i v = i.evaluate(intp) v 最後の値のみ残る 配列要素一個ずつ 最後の値を返す def intp_error!(msg) raise IntpError, "in #filename:#lineno: #msg" def inspect "#self.class.name/#lineno" 再掲 : DefNode: 関数定義 class DefNode < Node def initialize(file, lineno, fname, func) super file, lineno @funcname = fname @funcobj = func intp.define_function @funcname, @funcobj DefNode print("def ", @funcname, "(" ) print @funcobj.params[0] @funcobj.params[1..-1].map i print(", "); print(i) print(") ", " n") @funcobj.body.map i i.mimic(intp); print(" n") print("") Class Core def define_function(fname, node) raise IntpError, "function #fname defined twice" if @ftab.key?(fname) @ftab[fname] = node Function: 関数定義 class Function < Node def initialize(file, lineno, params, body) super file, lineno @params = params attr_reader :params @body = body attr_reader :body def call(intp, frame, args) unless args.size == @params.size raise IntpArgumentError, "wrong # of arg for #frame.fname() (#args.size for #@params.size)" args.each_with_index do v,i frame[@params[i]] = v exec_list intp, @body 関数定義の仕方 とりたい! defun : DEF IDENT param EOL stmt_list END IDENT result = DefNode.new(@fname, val[0][0], val[1][1], Function.new(@fname, val[0][0], val[2], val[4])) param stmt_list

再掲 : FuncallNode: 関数呼び出し class FuncallNode < Node def initialize(file, lineno, func, args) super file, lineno @funcname = func @args = args args = @args.map i i.evaluate intp begin intp.call_intp_function_or(@funcname, args) if args.empty? or not args[0].respond_to?(@funcname) intp.call_ruby_toplevel_or(@funcname, args) intp_error! "undefined function #@funcname.id2name" recv = args.shift recv.s @funcname, *args rescue IntpArgumentError, ArgumentError intp_error! $!.message FuncallNode: if ['+','-','*','/','^','=='].include?(@funcname) && @args.length==2 then print( "(" ) @args[0].mimic(intp) なくても動く print( @funcname) が Rubyは @args[1].mimic(intp) エラーとする print( ")" ) elsif '-@'==@funcname then print( "(" ) print( "-" ) @args[0].mimic(intp) print( ")" ) print(@funcname,"(") @args[0].mimic(intp) @args[1..-1].map i print(", "); i.mimic( intp ) print(") ") FuncallNode: 関数呼び出し 2 FuncallNode: 使い方 Class Core def call_intp_function_or(fname, args) if func = @ftab[fname] frame = Frame.new(fname) @stack.push frame func.call self, frame, args @stack.pop yield expr : expr '+' expr result = FuncallNode.new(@fname, val[0].lineno, '+', [val[0], val[2]]) def call_ruby_toplevel_or(fname, args) if @obj.respond_to? fname, true @obj.s fname, *args yield 再掲 : IfNode: if 文 class IfNode < Node def initialize(fname, lineno, cond, tstmt, fstmt) @condition = cond @tstmt = tstmt @fstmt = fstmt if @condition.evaluate(intp) exec_list intp, @tstmt exec_list intp, @fstmt if @fstmt IfNode: print( "if " ) @condition.mimic(intp) print( " then", " n") @tstmt.map i i.mimic( intp ); print(" n") if @fstmt!=nil then print( "", " n") @fstmt.map i i.mimic( intp ); print(" n") print( "")

IfNode: 使い方 if_stmt : IF stmt THEN stmt_list _stmt END result = IfNode.new( @fname, val[0][0], val[1], val[3], val[4] ) stmt stmt_list _stmt WhileNode: while class WhileNode < Node def initialize(fname, lineno, cond, body) @condition = cond @body = body while @condition.evaluate(intp) exec_list intp, @body print("while ") @condition.mimic(intp) print("do ", " n" ) @body.map i i.mimic(intp); print(" n") print(" " ) WhileNode: 使い方 とりたい! AssignNode: 代入 while_stmt: WHILE stmt DO EOL stmt_list END result = WhileNode.new(@fname, val[0][0], val[1], val[4]) class AssignNode < Node def initialize(fname, lineno, vname, val) @vname = vname @val = val intp.frame[@vname] = @val.evaluate(intp) print( @vname, " = " ) @val.mimic(intp) AssignNode: 使い方 assign : IDENT '=' expr result = AssignNode.new(@fname, val[0][0], val[0][1], val[2]) VarRefNode: 変数引用 class VarRefNode < Node def initialize(fname, lineno, vname) @vname = vname print( @vname ) if intp.frame.lvar?(@vname) intp.frame[@vname] intp.call_function_or(@vname, []) intp_error! "unknown method or local variable #@vname.id2name"

class Frame def initialize(fname) @fname = fname @lvars = attr :fname def lvar?(name) @lvars.key? name Rubyレファレンス クラス / メソッドの定義 中 演算子式の定義 使用例 : frame[@params[i]] = v def [](key) @lvars[key] def []=(key, val) @lvars[key] = val VarRefNode: 使い方 realprim : IDENT result = VarRefNode.new(@fname, val[0][0], val[0][1]) NUMBER result = LiteralNode.new(@fname, *val[0]) STRING result = StringNode.new(@fname, *val[0]) StringNode と LiteralNode class StringNode < Node def initialize(fname, lineno, str) @val = str @val.dup print( '"',@val,'"' ) class LiteralNode < Node def initialize(fname, lineno, val) @val = val @val print(@val) StringNode/LiteralNode : 使い方 realprim : IDENT result = VarRefNode.new(@fname, val[0][0], val[0][1]) NUMBER result = LiteralNode.new(@fname, *val[0]) STRING result = StringNode.new(@fname, *val[0]) 最後の部分 begin tree = nil もとは if ARGV.length>=1 then tree.evaluate であった fname = ARGV[0] fname = 'src.intp' File.open(fname) f tree = Intp::Parser.new.parse(f, fname) tree.mimic rescue Racc::ParseError, Intp::IntpError, Errno::ENOENT raise #### $stderr.puts "#File.basename $0: #$!" exit 1 簡単なテスト print(x,x*2) y=x*x print( y ) a=1 b=-3-a*2 d= "abcd" if a==1 then c=1 c=2 print( c ) j=3 i=1 while i==1 do print( j ) j=j-1 if j==1 then i=0 print(x, (x*2)) y = (x*x) print(y) a = 1 b = ((-3)-(a*2)) d = "abcd" if (a==1) then c = 1 c = 2 print(c) j = 3 i = 1 while (i==1)do print(j) j = (j-1) if (j==1) then i = 0

プログラムの実行 $ racc intm.y -o intm.rb 1 shift/reduce conflicts $ ruby intm.rb testm.txt > t.txt $ ruby testm.txt 132244 $ ruby t.txt 132244 補足 FuncallNode: で なくてもよい と書いた部分を省略すると 出力は次のようになる した状態 $ ruby intm2.rb testm.txt print(x, *(x, 2) ) y = *(x, x) print(y) a = 1 b = -(-@(3), *(a, 2) ) d = "abcd" if ==(a, 1) then c = 1 c = 2 print(c) j = 3 i = 1 while ==(i, 1) do print(j) j = -(j, 1) if ==(j, 1) then i = 0 print(x, (x*2)) y = (x*x) print(y) a = 1 b = ((-3)-(a*2)) d = "abcd" if (a==1) then c = 1 c = 2 print(c) j = 3 i = 1 while (i==1)do print(j) j = (j-1) if (j==1) then i = 0 つまり まとめ おおもと prefix 表現 infix 表現 print(x,x*2) y=x*x b=-3-a*2 if a==1 then while i==1 do print(x, *(x, 2) ) y = *(x, x) b = -(-@(3), *(a, 2) ) if ==(a, 1) then while ==(i, 1) do print(x, (x*2)) y = (x*x) b = ((-3)-(a*2)) if (a==1) then while (i==1)do LL から LR まで一通り ただし 原理的なことは省略した 例えば LR 表の作り方プログラムを作ってみた ( 改変ですが ) j=j-1 if j==1 then j = -(j, 1) if ==(j, 1) then j = (j-1) if (j==1) then 優先順位を用いないため括弧を多用 今後 もし機会があれば 実際のコード生成を試みてください