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

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

Oracle PL/SQL. Overview of PL/SQL

Løsningsforslag Skriftlig eksamen 3. januar 2013

! "# $$ &'()*"* +*, & &"*0* & "# % %- %

Aarhus Universitet, Science and Technology, Computer Science. Exam. Wednesday 27 June 2018, 9:00-11:00

program fibomain(input,output); var i, j,result : integer; var x, y: integer;

Project Step 7. Behavioral modeling of a dual ported register set. 1/8/ L11 Project Step 5 Copyright Joanne DeGroat, ECE, OSU 1

ECE 551: Digital System * Design & Synthesis Lecture Set 5

Aarhus Universitet, Science and Technology, Computer Science. Mock Exam. Wednesday 27 June 2018, 9:00-11:00

Programmering og Problemløsning, 2017

Netværksalgoritmer 1

F# - hvorfor, hvordan og til hvad? Rune Ibsen Jyske Bank

Lær Python - Dag 4, modul 2 Objektorienteret programmering

"# $%$ " # $ % $ $ " & ( ) *+!,! Sum_Cost >= 5000SirName = Beltov Continue = %!- + ( ( - True) Continue *! If Antal <= 20 Then EnhedsOmk = 1.

SAX Simple API for XML.

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

Terese B. Thomsen 1.semester Formidling, projektarbejde og webdesign ITU DMD d. 02/

Hent filoplysninger fra billeder og filer

On the complexity of drawing trees nicely: corrigendum

! " # $% &'!& & ' '" & # ' "&()(*& + + +,-' "&( # &(! (! " )(!# &!! (!&!! * (! +& (!!! & " " & & / & & (!

Web Admin 5.5. Brugsvejledning for User admin. Copyright 2003 Gullestrup.net

Lær Python dag 1 - modul 1

" #" $ " "!% &'% ' ( ) * " & #

Introduktion til funktioner, moduler og scopes i Python

MS Visual Studio Basic En kort vejledning

if (symbol == IDENTIFIER) { object = findprocedureobject(symboltable, identifier);

Introduction to JastAdd

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Derfor vil jeg bygge dette eksempel på een table hvor der kan tilkyttes personer til ALLE noder og der kan tilføjes et vilkårligt antal niveauer

Software Construction 1 semester (SWC) Spørgsmål 1

I profil-feltet kan imastra-kunder vælge om upload skal ske ligesom filerne var indsendt til mailboksen eller

Virkefeltsregler i Java

3. PROJEKT, 2 SEMESTER

En karakteristik af de regulære sprog. Ugens emner. FA minimering [ ] MyHill-Nerode-sætningen en algoritme til minimering af FA er

IBM WebSphere Operational Decision Management

User Manual for LTC IGNOU

Web Admin 5.5. Brugsvejledning for Domain admin. Copyright 2003 Gullestrup.net

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16,

Spil Master Mind. Indledning.

De 10 JavaScript eksamensspørgsmål

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

#AlleKanKode. Lektion 2 - Konstanter og Variabler

Indholdsfortegnelse If-sætningen... 3 Opgaver... 4 OR, AND sammen med if-sætningen... 5 Rand() funktion... 5 Opgave... 5 Include() funktionen...

Design Diaries.

Eksamen, DSDS, efterår 2008

Start på Arduino og programmering

Løsningsforslag Skriftlig eksamen 9. januar 2012

It og informationssøgning Forelæsning december 2006 Jakob Grue Simonsen. Diverse emner af almen interesse

Kommentarer til opgave 4-6

Skærmbilled 1: 2 Når man vil oprettet et emne kan man ikke uploade et billed. Skærmbilled 1:


Reeksamen, DSDS, forår 2008

Det er muligt at chekce følgende opg. i CodeJudge: og

PHP Snippets. De små korte. Skrevet af Daniel Pedersen

Dynamiske Web-applikationer i SAS-portalen

2 Funktionsorienteret programmering i Scheme.

Skriftlig eksamen i Datalogi

Vejledning til listings-pakken

Programmering og Problemløsning, 2017

Basic statistics for experimental medical researchers

Acse.y. V Page 1/4

Forelæsning Uge 2 Torsdag

how to save excel as pdf

Breaking Industrial Ciphers at a Whim MATE SOOS PRESENTATION AT HES 11

Verilog HDL. Presented by: Amir Masoud Gharehbaghi

Noter til kursusgang 8, IMAT og IMATØ

Forelæsning Uge 2 Mandag

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Løsning af skyline-problemet

Splunk Cookbook Lab Workshop

#Alle Kan Kode. Lektion 25 - Enums

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

Linear Programming ١ C H A P T E R 2

ArbejsskadeAnmeldelse

Programmeringscamp. Implementer funktionerne én for én og test hele tiden.

Bash-scriptning. Linuxadministration I 1DV417

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

Rigtig SQL Programmering

Kursusarbejde 3 Grundlæggende Programmering

! #!! $ % $! & " &'"! & *+ "! " $ $ ""!,-! $!.! $! " # 1!! &' "

Online kursus: Programming with ANSI C

Generalized Probit Model in Design of Dose Finding Experiments. Yuehui Wu Valerii V. Fedorov RSU, GlaxoSmithKline, US

Hvordan vælger jeg dokumentprofilen?

Tracking af YouTube i Google Tag Manager og Universal Analytics (Seneste version)

:51: [INFO ] [.o.core.internal.coreactivator] - openhab runtime has been started (v1.8.1) :51:55.

Programmering og Problemløsning, 2017

Fra programmering til mikroprocessor

Tredjepart webservices

INGENIØRHØJSKOLEN I ÅRHUS Elektro- og IKT-afdelingen. I3PRG3 + I3DTM3 + I3ISY1-3. semester

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

% &$ # '$ ## () %! #! & # &, # / # 0&. ) / & #& #

1 Opsumering fra tidligere. 2 Dagsorden 3 BIMS. 4 Programtilstande. Statements/kommandoer (Stm) i bims. 3.1 Abstrakt syntaks for bims

Programmering i C Videre med C (2 af 4) 19. marts 2007

Moduler i Standard ML

Sproget Rascal (v. 2)

Besvarelser til Lineær Algebra Reeksamen Februar 2017

PUT og INPUT funktionerne

Begrænsninger i SQL. Databaser, efterår Troels Andreasen

Tree klassen fra sidste forelæsning

Vilkår for brug GIS-Byggesag 1 af 48

Transkript:

# # intp # class Intp::Parser prechigh nonassoc UMINUS left '*' '/' left '+' '-' nonassoc EQ preclow rule program : stmt_list result = RootNode.new( val[0] ) stmt_list : result = [] stmt_list stmt EOL result.push val[1] stmt_list EOL stmt if_stmt : expr assign IDENT realprim result = FuncallNode.new( @fname, val[0][0], val[0][1], [val[1]] ) if_stmt while_stmt defun : IF stmt THEN EOL stmt_list _stmt END result = IfNode.new( @fname, val[0][0], val[1], val[4], val[5] ) _stmt : ELSE EOL stmt_list result = val[2] result = nil while_stmt: WHILE stmt DO EOL stmt_list END result = WhileNode.new(@fname, val[0][0], val[1], val[4]) defun param : DEF IDENT param EOL stmt_list END result = DefNode.new(@fname, val[0][0], val[1][1], Function.new(@fname, val[0][0], val[2], val[4])) : '(' name_list ')'

result = val[1] '(' ')' result = [] result = [] name_list : IDENT result = [ val[0][1] ] name_list ',' IDENT result.push val[2][1] assign : IDENT '=' expr result = AssignNode.new(@fname, val[0][0], val[0][1], val[2]) expr val[2]]) val[2]]) : expr '+' expr result = FuncallNode.new(@fname, val[0].lineno, '+', [val[0], expr '-' expr result = FuncallNode.new(@fname, val[0].lineno, '-', [val[0], expr '*' expr result = FuncallNode.new(@fname, val[0].lineno, '*', [val[0], val[2]]) expr '/' expr result = FuncallNode.new(@fname, val[0].lineno, '/', [val[0], val[2]]) expr EQ expr result = FuncallNode.new(@fname, val[0].lineno, '==', [val [0], val[2]]) primary primary : realprim '(' expr ')' result = val[1] '-' expr =UMINUS result = FuncallNode.new(@fname, val[0][0], '-@', [val[1]]) 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]) TRUE result = LiteralNode.new(@fname, *val[0]) FALSE result = LiteralNode.new(@fname, *val[0]) NIL result = LiteralNode.new(@fname, *val[0]) funcall funcall [2]) args : IDENT '(' args ')' result = FuncallNode.new(@fname, val[0][0], val[0][1], val IDENT '(' ')' result = FuncallNode.new(@fname, val[0][0], val[0][1], []) : expr result = val args ',' expr result.push val[2] ---- header # # intp/parser.rb # ---- inner def initialize @scope = RESERVED = 'if' => :IF, '' => :ELSE, 'while' => :WHILE, 'then' => :THEN, 'do' => :DO, 'def' => :DEF, 'true' => :TRUE, 'false' => :FALSE, 'nil' => :NIL, '' => :END RESERVED_V = 'true' => true, 'false' => false, 'nil' => nil

def parse(f, fname) @q = [] @fname = fname lineno = 1 f.each do line line.strip! until line.empty? case line when /\A\s+/, /\A\#.*/ ; when /\A[a-zA-Z_]\w*/ word = $& @q.push [(RESERVED[word] :IDENT), [lineno, RESERVED_V.key?(word)? RESERVED_V[word] : word.intern]] when /\A\d+/ @q.push [:NUMBER, [lineno, $&.to_i]] when /\A"(?:[^"\\]+ \\.)*"/, /\A'(?:[^'\\]+ \\.)*'/ @q.push [:STRING, [lineno, eval($&)]] when /\A==/ @q.push [:EQ, [lineno, '==']] when /\A./ @q.push [$&, [lineno, $&]] raise RuntimeError, 'must not happen' line = $' @q.push [:EOL, [lineno, nil]] lineno += 1 @q.push [false, '$'] do_parse def next_token @q.shift def on_error(t, v, values) if v line = v[0] v = v[1] line = 'last' raise Racc::ParseError, "#@fname:#line: syntax error on #v.inspect" ---- footer # intp/node.rb module Intp class IntpError < StandardError; class IntpArgumentError < IntpError; class Core def initialize @ftab = @obj = Object.new @stack = [] @stack.push Frame.new '(toplevel)' def frame @stack[-1]

def define_function(fname, node) raise IntpError, "function #fname defined twice" if @ftab.key?(fname) @ftab[fname] = node def call_function_or(fname, args) call_intp_function_or(fname, args) call_ruby_toplevel_or(fname, args) yield 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 def call_ruby_toplevel_or(fname, args) if @obj.respond_to? fname, true @obj.s fname, *args yield class Frame def initialize(fname) @fname = fname @lvars = attr :fname def lvar?(name) @lvars.key? name def [](key) @lvars[key] def []=(key, val) @lvars[key] = val class Node def initialize(fname, lineno) @filename = fname @lineno = lineno attr_reader :filename attr_reader :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" class RootNode < Node def initialize(tree) super nil, nil @tree = tree def evaluate exec_list Core.new, @tree class DefNode < Node def initialize(file, lineno, fname, func) super file, lineno @funcname = fname @funcobj = func intp.define_function @funcname, @funcobj 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

class Function < Node def initialize(file, lineno, params, body) super file, lineno @params = params @body = 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 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 class WhileNode < Node def initialize(fname, lineno, cond, body) @condition = cond @body = body while @condition.evaluate(intp) exec_list intp, @body class AssignNode < Node def initialize(fname, lineno, vname, val) @vname = vname @val = val intp.frame[@vname] = @val.evaluate(intp)

class VarRefNode < Node def initialize(fname, lineno, vname) @vname = vname if intp.frame.lvar?(@vname) intp.frame[@vname] intp.call_function_or(@vname, []) intp_error! "unknown method or local variable #@vname.id2name" class StringNode < Node def initialize(fname, lineno, str) @val = str @val.dup class LiteralNode < Node def initialize(fname, lineno, val) @val = val @val # module Intp begin tree = nil fname = 'src.intp' File.open(fname) f tree = Intp::Parser.new.parse(f, fname) tree.evaluate rescue Racc::ParseError, Intp::IntpError, Errno::ENOENT raise #### $stderr.puts "#File.basename $0: #$!" exit 1