ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Samankaltaiset tiedostot
S if b then S else S S s. (b) Muodosta (a)-kohdan kieliopin kanssa ekvivalentti, so. saman kielen tuottava yksiselitteinen.

S if b then S else S S s. (b) Muodosta (a)-kohdan kieliopin kanssa ekvivalentti, so. saman kielen tuottava yksiselitteinen.

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

Laskennan mallit (syksy 2010) Harjoitus 8, ratkaisuja

S BAB ABA A aas bba B bbs c

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 16. helmikuuta 2012

T Syksy 2006 Tietojenkäsittelyteorian perusteet T Harjoitus 7 Demonstraatiotehtävien ratkaisut

T Syksy 2002 Tietojenkäsittelyteorian perusteet Harjoitus 8 Demonstraatiotehtävien ratkaisut

Attribuuttikieliopit

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Jäsennysalgoritmeja. TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 29. syyskuuta 2009 TIETOTEKNIIKAN LAITOS. Jäsennysalgoritmeja

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Moduli 5: Kehittyneitä piirteitä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Tietorakenteet ja algoritmit

Yhteydettömät kieliopit [Sipser luku 2.1]

Yhteydettömän kieliopin jäsennysongelma

Tietueet. Tietueiden määrittely

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

TIEA241 Automaatit ja kieliopit, kevät 2011 (IV) Antti-Juhani Kaijanaho. 29. huhtikuuta 2011

arvostelija JavaCC Petri Kärki Helsinki 15. huhtikuuta 2005 Seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

(0 1) 010(0 1) Koska kieli on yksinkertainen, muodostetaan sen tunnistava epädeterministinen q 0 q 1 q 2 q3

follow(a) first(α j ) x

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Loppukurssin järjestelyt C:n edistyneet piirteet

5.5 Jäsenninkombinaattoreista

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

2. Yhteydettömät kielet

Loppukurssin järjestelyt

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Esimerkki 1: Kahviautomaatti.

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

Binäärioperaatiot Tiedostot ja I/O

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Binäärioperaatiot Tiedostot ja I/O

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Tietorakenteet ja algoritmit

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Automaattiteoria diskreetin signaalinkäsittelyn perusmallit ja -menetelmät ( diskreettien I/O-kuvausten yleinen teoria)

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Esimerkki 47. Kieli {a i b j c k : i = j tai j = k} on luonnostaan moniselitteinen.

Ohjelmoinnin peruskurssien laaja oppimäärä

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

Rakenteiset tietotyypit Moniulotteiset taulukot

ICS-C2000 Tietojenkäsittelyteoria. Tähän mennessä: säännölliset kielet. Säännöllisten kielten pumppauslemma M :=

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

uv n, v 1, ja uv i w A kaikilla

ICS-C2000 Tietojenkäsittelyteoria

Metodien tekeminen Javalla

Ohjelmoinnin perusteet, syksy 2006

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä.

Makrojen mystinen maailma lyhyt oppimäärä

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

C-kurssi kevät Luennon sisältö

Luennon sisältö. C-kurssi kevät Tasokokeen kohta 1: Taulukon järjestäminen. Tasokokeen kohta 2. Tasokokeen kohta 2. Tasokokeen kohta 3

Ohjausrakenteet. Valinta:

Luento 5. Timo Savola. 28. huhtikuuta 2006

ICS-C2000 Tietojenkäsittelyteoria

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

C-kurssi syksy ltö. Luennon sisält. Luento 2: tyypit, rakenteet, makrot Tyypit. signed, unsigned short,, long Vakiot const Rakenteet

Luennon sisält. ltö. C-kurssi syksy ääreet: int ja char. Yksinkertaiset tyypit. Kokonaisluvut. Merkit

5/20: Algoritmirakenteita III

public static void main (String [] args)

Ohjelmoinnin perusteet Y Python

Scheme-kesäkurssi luento 3

Ei-yhteydettömät kielet [Sipser luku 2.3]

3. Binääripuu, Java-toteutus

Johdatus ohjelmointiin / Lausekielinen ohjelmointi 1 & 2

if-lauseen yksinkertaisin muoto on sellainen, missä tietyt lauseet joko suoritetaan tai jätetään suorittamatta.

TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjeet. AS C-ohjelmoinnin peruskurssi Aalto-yliopiston sahkotekniikan korkeakoulu Tentti , Raimo Nikkila

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

11. Javan valintarakenteet 11.1

Chomskyn hierarkia ja yhteysherkät kieliopit

Ohjelmointiharjoituksia Arduino-ympäristössä

11. Javan valintarakenteet 11.1

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 2. helmikuuta 2012

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

jäsennyksestä TIEA241 Automaatit ja kieliopit, syksy 2016 Antti-Juhani Kaijanaho 29. syyskuuta 2016 TIETOTEKNIIKAN LAITOS Kontekstittomien kielioppien

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

Kääntäjän virheilmoituksia

Ohjelmoinnin peruskurssien laaja oppimäärä

11.4. Context-free kielet 1 / 17

8. Näppäimistöltä lukeminen 8.1

Muuttujien roolit Kiintoarvo cin >> r;

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

811120P Diskreetit rakenteet

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

Tietorakenteet ja algoritmit

M =(K, Σ, Γ,, s, F ) Σ ={a, b} Γ ={c, d} = {( (s, a, e), (s, cd) ), ( (s, e, e), (f, e) ), (f, e, d), (f, e)

Ohjelmoinnin peruskurssien laaja oppimäärä

Listarakenne (ArrayList-luokka)

Transkriptio:

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016 Kierros 6, 22. 26. helmikuuta Huom: arviointiviikolla 15. 19.2. ei ole laskuharjoituksia! Demonstraatiotehtävien ratkaisut D1: (a) Osoita, että seuraava yhteydetön kielioppi on moniselitteinen: S if b then S S if b then S else S S s. (b) Muodosta (a)-kohdan kieliopin kanssa ekvivalentti, so. saman kielen tuottava yksiselitteinen kielioppi. (Vihje: Ota käyttöön uudet välikkeet B ja U, joista ensimmäinen tuottaa vain tasapainoisia ja jälkimmäinen vain tasapainottomia if-then-elsejonoja.) Ratkaisu: Yhteydetön kielioppi G on moniselitteinen, mikäli on olemassa sana w L(G) siten, että w:llä on ainakin kaksi erilaista jäsennyspuuta. Tehtävän kieliopille yksinkertaisin tällainen sana on: if b then if b then s else s, joka voidaan jäsentää kahdella tapaa: 1

Yleensä ohjelmointikielissä halutaan else-lause liittää lähinpään mahdolliseen if-lauseeseen. Ylläolevista puista ensimmäinen vastaa tätä käytäntöä. Määritellään kielioppi seuraavasti: G = (V,Σ,P,S) V = S,B,U,s,b,if,then,else Σ = s,b,if,then,else P = S B U B if b then B else B s U if b then S if b then B else U Tässä välikeellä B saadaan johdettua vain ohjelmia, joissa kaikilla if-lauseilla on sekä thenettä else-haarat. Välikkeellä U johdetaan sitten if-lauseet, joista puuttuu else-haara. D2: Laadi osittava (rekursiivisesti etenevä) jäsentäjä edellisten harjoitusten demotehtävän ohjelmointikielen kieliopille. Ratkaisu: Alla oleva C-ohjelma toteuttaa rekursiivisen jäsentäjän kieliopille: C S S;C S a begin C end for n times do S Tässä on yksinkertaistettu hieman edellisen laskuharjoituskerran 5. tehtävän kielioppia korvaamalla erilliset numerot terminaalilla n, joka tarkoittaa mitä tahansa numeroa. Tärkeimmät ohjelmassa esiintyvät funktiot ovat: C(), S() toteuttavat kieliopin varsinaiset säännöt lex() lukee syötteestä seuraavan lekseemin ja tallettaa sen globaaliin muuttujaan current_tok. expect(int token) yrittää lukea syötteestä lekseemin token. Mikäli lukeminen epäonnistuu annetaan virheilmoitus. consume_token() merkitään tämänhetkinen lekseemi käytetyksi. Tämä (tai jokin muu vastaava funktio) tarvitaan siksi, että joissain tapauksissa täytyy syötettä lukea yksi lekseemi eteenpäin ennen kuin tiedetään, mitä sääntöä täytyy käyttää. Käytännössä ohjelmointikielten jäsentäjät toteutetaan yleensä käyttäen lex- ja yacc-työkaluja 1. Näistä lex muodostaa tilakonepohjaisen selaajan, joka tunnistaa säännöllisillä lausekkeilla määritellyt lekseemit, ja yacc tekee pinoautomaattipohjaisen jäsentimen annetulle yhteydettömälle kieliopille. 1 Tai niiden johdannaisia kuten flex tai bison. 2

#include <stdio.h> #include <stdlib.h> #include <ctype.h> /* Define the alphabet */ enum TOKEN DO, FOR, END, BEGIN, TIMES, OP, SC, NUMBER, ERROR ; const char* tokens[] = "do", "for", "end", "begin", "times", "a", ";", "NUMBER", NULL ; /* A global variable holding the current token */ int current_tok = ERROR; /* Maximum length of a token */ #define TOKEN_LEN 128 /* declare functions corresponding to nonterminals */ void S(void); void C(void); int lex(void); void consume_token(void); void error(char *st); void expect(int token); void C(void) S(); lex(); if (current_tok == SC) printf("c => S ; C\n"); else printf("c => S\n"); void S(void) lex(); switch (current_tok) case OP: printf("s => a\n"); case BEGIN: expect(end); printf("s => begin C end\n"); 3

case FOR: expect(number); expect(times); expect(do); S(); printf("s => for N times do S\n"); default: error("parse error"); /* int lex(void) returns the next token of the input. */ int lex(void) static char token_text[token_len]; int pos = 0, c, i, next_token = ERROR; /* Is there an existing token already? */ if (current_tok!= ERROR) return current_tok; /* skip whitespace */ do while (c!= EOF && isspace(c)); if (c!= EOF) ungetc(c, stdin); /* read token */ while (c!= EOF && c!= ';' &&!isspace(c) && pos < TOKEN_LEN) token_text[pos++] = c; if (c == ';') if (pos == 0) /* semicolon as token */ next_token = SC; else /* trailing semicolon, leave it for future */ ungetc(';', stdin); token_text[pos] = '\0'; /* trailing zero */ /* identify token */ if (isdigit(token_text[0])) /* number? */ next_token = NUMBER; else /* not a number */ for (i = DO; i < NUMBER; i++) if (!strcmp(tokens[i], token_text)) next_token = i; 4

current_tok = next_token; return next_token; void consume_token(void) current_tok = ERROR; void error(char *st) printf(st); exit(1); /* try to read a 'token' from input */ void expect(int token) int next_tok = lex(); if (next_tok == token) return; else error("parse error"); int main(void) int i; return 0; 5