Paradigmer i Programmering 4. Resten af ML -Læse fra/skrive til filer -Interaktive programmer -Separat oversættelse -Parsergeneratorer.

Slides:



Advertisements
Lignende præsentationer
Velkommen til Softwarekonstruktion
Advertisements

C# introduktion. using System; Namespace MyFirst { class eks1 { public static void Main() { Console.WriteLine("Hej!"); Console.Write("Skriv dit navn her:
Programmeringsparadigmer.
Begreber og Redskaber 6. Afprøvning Formål: •Ekstern afprøvning (Funktionstest). •Hvordan dokumenterer man afprøvning i en rapport. •Hvordan konstuerer.
Symbolsk maskinsprog.
Distribueret programmering, specielt.NET Remoting Rasmus D. Lehrmann DM
1 Parsing. 2 Mål: Et program til indlæsning og beregning af aritmetiske udtryk Eksempel: Beregn (3*5 + 4/2) - 1 Løs et lettere problem først: Læs en streng.
NetBeans Installation og brug.
1 Filer - intro Data-hierarki Filer og strømme (eng.: streams) af bytes Klasserne File og Directory Oprettelse af sekventiel tekstfil Læsning af data fra.
Exceptions. 2 Nordjyllands Erhvervakademi – 2009 Objectives “Unfortunately, errors are a part of life. Some are detected by the compiler, some are detected.
Hvordan man skriver koden.
Intro Variabler - datatyper. 2. forelæsning Hvad skete sidste gang Hvad er PHP? Kursussammensætning: læse – newsgroup – forelæsning – øvelsestime – aflevering.
MATLAB Programplanlægning Anders P. Ravn Institut for Datalogi Aalborg Universitet Forår 2003 >>mit_program(`ud.txt´) myconstants.m function mit_program(iud)
Sproghistorie Syntaks (struktur) Semantik (Indhold)
Indledende Programmering Uge 5 - Efterår 2006 Om at udvikle korrekte og pålidelige programmer Susanne Lindros.
GP5, Martin Lillholm 1 Grundlæggende Programmering (GP) Efterår 2005 Forelæsning 5 Slides ligger på nettet. Du er velkommen til at printe dem nu. Vi begynder.
FEN IntroJava AAU1 Opsamling: afvikling af Java-programmer Input fra keyboard og fil Fra en prompt Fra BlueJ Fra NetBeans.
Programering af mobile enheder Windows Phone Storage.
NOEA/IT - FEN1 Typeparametisering/Genericity Generics i.NET 2 og C#
1 Unified Expression Language Copyright © Lund & Bendsen A/S Unified Expression Language.
Paradigmer i Programmering 4. IO + oversigt over udtryk.
Begreber og Redskaber 2. Plan for idag Noget om bestanddelene i et programmeringssprog Syntaksbeskrivelse af java Næste gang: –Binære tal –Repræsentation.
Buttom-up parsning: Hvor er vi Mellem- kode Kald til Runtimesys. Mellemk.- optimering Kode- generering Kode- optimering Leksikalsk- analyse Syntax- analyse.
W1b1 PC baseret analyse og simulering. w1b2 Definition Digital Elektronisk beregningsmaskine, der har intern hukommelse til lagring af program og mellem-regninger.
Lektion 7 Læsestof: Kopier fra Caranno
Fundamentale datastrukturer
MATLAB Programplanlægning Anders P. Ravn Institut for Datalogi Aalborg Universitet Forår 2003 >>mit_program(‘ind.txt’.`ud.txt´) myconstants.m function.
Ingeniørhøjskolen i Århus Slide 1 Newton approximation ”Oversæt” til algoritme - Step 5: Skriv kode - Step 4: Skriv pseudokode - Step 3: Specificér pre-
DATATYPER. For at tilpasse hvert felt i databasen til dets formål og dermed øge funktionalitet 1 bit er tilstrækkelig til at angive køn (0/1) men for.
Procestræ under afvikling af cp init login shell cp cp src dest.
Paradigmer i Programmering 2. Sammensatte typer Tupler og lister Programmering med rekursion Programmering med pipe-lines Programmering med polymorfe.
Paradigmer i Programmering 1. Program for idag : Funktioner og udtryk i SML : Øvelse : Frokost – 14.00: Deklarative.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
11 - Exceptions. 2 NOEA2009Java-kursus – Exceptions Hvad er en exception? En undtagelse. Typisk en fejl der opstår runtime Afbryder det normale programflow.
FEN IntroJava AAU1 Klasser og objekter Grundbegreber Student-Course.
Paradigmer i Programmering 1. Plan for kurset 4 x Mads R, 4 x Torben B, 2 x opgave MR: Funktionsprogrammering, SML TB: Logikprogrammering, Prolog Opgave:
KF04 GRAY Item 2, 12, 22, 32, 42, 52. Consider a builder when faced with many constructor parameters Item 2.
JavaCC Top-down (Recursive descent). Mest populære mht Java. Regulær grammatik og Context-free grammatik i en fil. Tillader EBNF: (..)*, (..)+ og (..)?
C#: Udtryk og metoder Kilde: Joe Hummel. 2 Nordjyllands Erhvervakademi – 2008 Indhold “With regards to programming statements and methods, C# offers what.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
PD – kursusgang 3 Introduktion til Java Script. Mål Viden om hvordan JavaScripts indlejres i HTML dokumenter Viden om programmering i JavaScript  Erklæring.
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
Intro Evaluering De sidste to gange?. HTTP, cookies og sessions Forelæsning nr 10 Tilbage til trafikken mellem server – client Sende HTTP-request og respons.
9. Interfaces. 2 Nordjyllands Erhvervakademi Objectives “Good class design starts with good application design — how many classes, do they relate.
Tekst filer Tekstfiler opbygges normalt af linier, hvor disse ikke behøver at være samme længde. Når man skal arbejde med tekstfiler, ønsker man metoder.
Paradigmer i Programmering 3. Højere ordens funktioner Idag: Højere ordens funktioner Algebraiske datatyper Næste gang: I/O, Filer, interaktive programmer.
Begreber og Redskaber 3. Plan for idag Om metoder, parametre, returværdier Overblik over klasser,objekter,nedarvning Et par ord om objekt-orientering.
1 Processer. 2 fork int fork(); Danner en ny proces med samme indhold som forældre processen. I begge processer er programtælleren placeret lige efter.
I o p o DAIMI, AU, November 1999Programkonstruktion I9E.1 Konstruktion og brug af klasser – en stak og en HP-regnemaskine push pop.
Fundamentale sprogbegreber Sætninger og udtryk Niveauer af programbeskrivelse (statisk versus dynamisk syn)
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6B.1 Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence.
DAIMIIntroducerende objektorienteret programmering4B.1 Typer og tilstand i Java Typer, tilstand, erklæring, variable, primitive datatyper, reference- og.
(let ((title ’(Scheme Macros)) title) Syntaktiske transformationer og en masse parenteser.
DAIMIIntroducerende objektorienteret programmering3B.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
 Michael E. Caspersen, 2000Introducerende objektorienteret programmering6A.1 Programmering med interfaces – en stak og en HP-regnemaskine push pop.
DAIMIIntroducerende objektorienteret programmering4B.1 Grundlæggende og Reference Typer i Java Typer, tilstand, erklæring, reference- og værdi semantik,
Trinvis forfinelse Systematisk, gradvis udvikling af programmer.
Programmering med interfaces Separering af specifikation, anvendelse og implementation.
Programmering med interfaces – en stak og en HP-regnemaskine push pop.
Jesper Mosegaard Multimedie Programmering E2003 MMProg uge44 Java til Lingo Klasser, statements og lister.
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
I o p o DAIMI, AU, September 1999Introducerende objektorienteret programmering5C.1 Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence.
Paradigmer i Programmering 0. Plan for kurset 4 x Mads R, 4 x Torben B, 2 x opgave MR: Funktionsprogrammering, SML TB: Logikprogrammering, Prolog Opgave:
Virkefeltsregler i Java int i; int j; int k; i = i+j; String t; Sequence s; int i; int j; Sequence s; String s; int i; int j;
Fromelle sprog Per P. Madsen Afd. for proceskontrol.
Embedded SW – C & picoBlaze
I det efterfølgende kommer nogle eksempler på C kode som adskiller sig fra det vi normalt anvender i C# Hvis du har behov for hurtigt at afprøve små stumper.
Sproghistorie Syntaks (struktur) Semantik (Indhold)
Studiepraktik Thomas Bøgholm Mikkel Hansen Jacob Elefsen
Programmering.
Præsentationens transcript:

Paradigmer i Programmering 4

Resten af ML -Læse fra/skrive til filer -Interaktive programmer -Separat oversættelse -Parsergeneratorer

Læse en fil fun readfile1 is = if TextIO.endOfStream is then (TextIO.closeIn is; []) else (TextIO.inputLine is)::(readfile1 is); fun readfile nm = readfile1 (TextIO.openIn nm); val lst = readfile "tst.sml"; quit();

Resultat Moscow ML version 2.00 (June 2000) Enter `quit();' to quit. [opening file "C:\mads\undvs\pip-f02\tst.sml"] > val readfile1 = fn : instream -> string list > val readfile = fn : string -> string list > val lst = ["fun readfile1 is = \n", " if TextIO.endOfStream is \n", " then (TextIO.closeIn is; [])\n", " else (TextIO.inputLine is)::(readfile1 is);\n", "fun readfile nm = \n", " readfile1 (TextIO.openIn nm);\n", "\n", "val fil=readfile \"tst.sml\";\n", "quit();\n", "\n", "\n"] : string list

Skrive til en fil fun writefile1 os [] = TextIO.closeOut os | writefile1 os (x::xs) = (TextIO.output(os,x) ; writefile1 os xs); fun writefile nm lst = writefile1 (TextIO.openOut nm) lst; writefile "tst1.sml" lst;

TextIO del-oversigt val stdIn = : instream val stdOut = : outstream val openIn = fn : string -> instream val openOut = fn : string -> outstream val openAppend = fn : string -> outstream val inputLine = fn : instream -> string val endOfStream = fn : instream -> bool val print = fn : string -> unit val output = fn : outstream * string -> unit val closeIn = fn : instream -> unit val closeOut = fn : outstream -> unit

printVal i fortolkeren - val x = ([1,2,3],"hej",true); > val x = ([1, 2, 3], "hej", true) : int list * string * bool - printVal x; ([1, 2, 3], "hej", true) > val it = ([1, 2, 3], "hej", true) : int list * string * bool printVal kan bruges for alle typer, men kan kun bruges i fortolkeren - ikke i et oversat program

Dialog fun rl() = TextIO.inputLine(TextIO.stdIn); fun wl x = (TextIO.output(TextIO.stdOut,x); TextIO.flushOut(TextIO.stdOut)); fun readtoblank () = let val ln = rl() in if ln="\n" then [ln] else ( wl ("læste : "^ln); ln::(readtoblank()) ) end; val x = readtoblank(); val y = quit();

Lidt mere generelt fun processtoexit f state = let val ln = (wl ”- ”;rl()) in if ln="exit\n" then state else processtoexit f (f ln state) end; fun ff ln state = val x = processtoexit ff []; ff : tekst -> tilstand -> tilstand hver linie inddata giver programmet en ny tilstand

Typer > val rl = fn : unit -> string > val wl = fn : string -> unit > val readtoblank = fn : unit -> string list > val 'a processtoexit = fn : (string -> 'a -> 'a) -> 'a -> 'a > val 'a ff = fn : 'a -> 'a list -> 'a list

mosmlc tst.sml C:\mads\undvs\pip-f03>mosmlc tst.sml C:\mads\undvs\pip-f03>mosmlout ghs - exit C:\mads\undvs\pip-f03>

Referencer val = ref lav reference til værdi ! hent værdi fra reference := ændre værdi af reference

Referencer - val x = ref [1]; > val x = ref [1] : int list ref - x := 2::(!x); > val it = () : unit - x; > val it = ref [2, 1] : int list ref - x := 3::(!x); > val it = () : unit - x; > val it = ref [3, 2, 1] : int list ref

Lommeregner program: Explist Explist: ε - ingenting | Exp ”;” Explist Exp: Number | ”(” Exp ”)” | Exp ”+”Exp | Exp ”-” Exp | Exp ”*” Exp | Exp ”/” Exp | Exp ”%” Exp

Struktur Leksikalsk analyse: inddatastrøm -> buffer -> terminalsymbol Syntaksanalyse (buffer -> terminalsymbol) -> syntakstræ Semantisk analyse: syntakstræ -> uddata Hovedprogram: filnavn -> uddata semantik ( syntaks ( leksikalsk(openIn filnavn))))

Oversættelse mosmllex Exlex.lexgenerer Exlex.sml mosmlyac -v Expar.grmgenerer Expar.sml mosmlc -c Absyn.sml oversæt abstr. syntaks mosmlc -c -liberal Expar.sig Expar.sml parser mosmlc -c Exlex.sml leksikalsk analysator mosmlc -o Main.exe Main.sml hovedprogram Main test.txt testkørsel

Abstrakt syntaks datatype exp = Const of int | Binop of string * exp * exp;

YACC fil (del 1) %{ open Absyn; %} %token NUMBER %token STRING NAME %token MAX MIN PLUS MINUS TIMES DIV MOD %token LPAR RPAR SEMI COMMA EOF %left PLUS MINUS %left TIMES DIV MOD %start Main %type Main Explist %type Exp %

YACC fil (del 2) Main: Explist EOF { $1 } ; Explist: /* empty */ { [] } | Exp SEMI Explist { $1 :: $3 } ; Exp: NUMBER { Const $1 } | LPAR Exp RPAR { $2 } | Exp PLUS Exp { Binop("+", $1, $3) } | Exp MINUS Exp { Binop("-", $1, $3) } | Exp TIMES Exp { Binop("*", $1, $3) } | Exp DIV Exp { Binop("/", $1, $3) } | Exp MOD Exp { Binop("%", $1, $3) } ;

Lex fil (del 1) { open Lexing Expar; exception LexicalError; fun keyword s = case s of "max" => MAX | "min" => MIN | _ => NAME s; (* bruges ikke her *) }

Lex fil (del 2) rule Token = parse [` ` `\t` `\n` `\r`] { Token lexbuf } | [`0`-`9`]+ { NUMBER (Option.valOf (Int.fromString (getLexeme lexbuf))) } | [`a`-`z``A`-`Z`][`a`-`z``A`-`Z``0`-`9`]* { keyword (getLexeme lexbuf) } | `+` { PLUS } | `-` { MINUS } | `*` { TIMES } | `/` { DIV } | `%` { MOD } | `(` { LPAR } | `)` { RPAR } | `;` { SEMI } | `,` { COMMA } | "/*" { SkipComment lexbuf; Token lexbuf } | eof { EOF } | _ { raise LexicalError } and SkipComment = parse "*/" { () } | (eof | `\^Z`) { raise LexicalError } | _ { SkipComment lexbuf } ;

Main (del 1) open Absyn; (* den abstrakte syntaks *) fun eval (Const n) = n | eval (Binop("+",e1,e2))= (eval e1)+(eval e2) | eval (Binop("-",e1,e2)) = (eval e1)-(eval e2) | eval (Binop("*",e1,e2)) = (eval e1)*(eval e2) | eval (Binop("/",e1,e2)) = (eval e1) div (eval e2) | eval (Binop("%",e1,e2)) = (eval e1) mod (eval e2) ; fun evalprint e = let val r = eval e in print ((Int.toString r)^"\n") end;

Main (del 2) fun createLexerStream ( is : BasicIO.instream ) = Lexing.createLexer ( fn buff => fn n => Nonstdio.buff_input is buff 0 n) fun compile filename = let val stream = BasicIO.open_in filename; val lexbuf = createLexerStream stream; val elist = Expar.Main Exlex.Token lexbuf in app evalprint elist end handle Parsing.ParseError f => raise Fail "Syntactical error" | Exlex.LexicalError => raise Fail "Lexical error"; val _ = compile (List.nth(Mosml.argv (),1))

Udtryk konstanter parametre operationer og funktionskald (,, ) [,, ] raise handle if then else ( ; ; ) let ; ;.. in end case of fn

Operationer andalso, orelse (sprogkonstruktioner) + - * div mod = <> >= > <= < ^ o before f.eks (3 before print ”hej”) udskriv ”hej” og returner 3

, match ::= mrule { ”|” mrule } mrule ::= pat ”=>” exp dec ::= ”val” pat ”=” exp { ”and” pat ”=” exp} | ”fun” nm pat-list = exp |... ”and”... | ”datatype”.. | ”exception”.. | ”local” dec ”in” dec ”end” | ”infix”...

case udtryk - fun myapp [] ys = ys | myapp (x::xs) ys = x::(myapp xs ys); > val 'a myapp = fn : 'a list -> 'a list -> 'a list - fun myapp xl yl = case xl of [] => yl | (x::xs) => x::(myapp xs yl); > val 'a myapp = fn : 'a list -> 'a list -> 'a list

Hvad mere -Records -Structure, signature, functor -Separat oversættelse -Interface til C, databaser, cgi, socket -Principperne for typecheck

Hvorfor ML ”what is it good for?” Styrker – kompleks, videnstung programstil Godt for den stærke programmør Komplekse systemer udtrykkes kompakt Svaghed – kræver god abstraktionsevne Tungt til interaktive programmer - grafik