Skip to content

Instantly share code, notes, and snippets.

@msciborski
Created January 6, 2018 15:40
Show Gist options
  • Save msciborski/15e36db45990f6aea653313788e12b0f to your computer and use it in GitHub Desktop.
Save msciborski/15e36db45990f6aea653313788e12b0f to your computer and use it in GitHub Desktop.
Lex1
Zadanie 1:
--------------------------------------------------------------------------
Plik wejściowy zawiera ciąg wierszy, z których każdy składa się z: nazwiska osoby, niepustego ciągu spacji lub tabulacji i listy oddzielonych od siebie średnikiem ; nazw towarów, po których w nawiasie znajduje się ich cena (liczba rzeczywista), bądź znak -, jeśli cena nie jest znana. Spacje są swobodnie rozmieszczone na liście zakupów.
Należy usunąć wszystkie spacje na liście zakupów, a po nazwisku umieścić dokładnie jeden dwukropek i trzy spacje.
Nazwisko zaczyna sie z wielkiej litery, nazwa towaru jest pisana z małej litery.
Na przykład:
Iksinski chleb ( - ) ; mleko ( 3.5); ser (8.24) ;
Ygrekowska mydlo ( 5.0 ); powidlo(-) ;
powinniśmy uzyskać:
Iksinski: chleb(-);mleko(3.5);ser(8.24);
Ygrekowska: mydlo(5.0);powidlo(-);
%{
#include <stdio.h>
%}
%%
[A-Z][a-z]+ {ECHO; printf(": ");}
[ ]* {printf("");} ;
%%
Zadanie 2:
-----------------------------------------------------------------------------
Napisz program w języku Lex służący do sprawdzenia, czy linia tekstu zawiera napis postaci 0n1n (0 do potęgi n i 1 do potęgi n),n >= 0. Jeśli tak, to należy dołączyć na końcu linii napis OK poprzedzony spacją, w przeciwnym wypadku - napis ERROR.
Poprawne ciągi zawierają wyłącznie zera i jedynki oraz znak nowej linii (bez spacji i tabulacji).
Na przykład dla wejścia:
010101
000111
00 11
01 01
powinniśmy uzyskać:
010101 Error
000111 OK
00 11 Error
OK
01 01 Error
%Start zero, jeden, error
%{
#include <stdio.h>
int counter = 0;
%}
%%
<INITIAL>[0] {printf("%s", yytext); BEGIN(zero);}
<INITIAL>[1] {printf("%s", yytext); BEGIN(error);}
<INITIAL>[\n] {printf(" OK");}
<zero>[0] {printf("0");}
<zero>[1] {printf("1"); BEGIN(jeden);}
<jeden>[1] {printf("1");}
<jeden>[0] {printf("0"); BEGIN(error);}
<error>[0] {printf("0");}
<error>[1] {printf("1");}
<zero>[\n] {printf(" OK \n"); BEGIN(INITIAL);}
<jeden>[\n] {printf(" OK \n"); BEGIN(INITIAL);}
<error>[\n] {printf(" ERROR \n"); BEGIN(INITIAL);}
. {printf("%s", yytext); BEGIN(error);}
Zadanie 3:
------------------------------------------------------------------------
Napisz w język Lex program, który zamieni każdy znak oprócz litery i nowej linii znakiem minusa -.
Dla wejścia:
J.M. Kowal
60-965 Poznan, Poland
tel.: 0616653724
e-mail: kowal@put.poznan.pl
powinniśmy uzyskać:
J-M--Kowal
-------Poznan--Poland
tel-------------
e-mail--kowal-put-poznan-pl
%{
#include <stdio.h>
%}
%%
[A-Za-z\n] ECHO;
. {printf("-");}
%%
Zadanie 4:
--------------------------------------------
Napisz w języku Lex program, który wczyta wiersze wejściowe, usunie z nich początkowe spacje i w tej postaci przepisze je na wyjście.
Dla wejścia:
12345 abc ;
345 abc ;
:-) :-( ;-)
:-) :-(
Powinnismy uzyskać:
12345 abc ;
345 abc ;
:-) :-( ;-)
:-) :-(
%{
#include <stdio.h>
%}
%%
^[ ]+ ;
. ECHO;
%%
Zadanie 4a:
--------------------------------------------
Napisz w języku Lex program, który wczyta i przepisze wiersze wejściowe zawierające ciągi "faces" (oddzielonych od siebie dowolną liczbą spacji) zakończone średnikiem ;, a następnie ustali "średni humor" w każdej linii oraz zaznaczy go, po spacji, gwiazdce * i spacji, za pomocą symbolu "face". Należy przyjąć następujące "miary humoru":
:-) 1
:-| 0
:-( -1
Dla wejścia:
:-) :-) :-| ;
:-( :-) ;
:-) :-( :-| ;
:-) :-) ;
Powinniśmy uzyskać:
:-) :-) :-| * :-)
:-( :-) * :-|
:-) :-( :-| * :-|
:-) :-) * :-)
%{
#include <stdio.h>
int mood = 0;
%}
%%
":-)" {mood++; ECHO;}
":-(" {mood--; ECHO;}
":-|" {ECHO;}
";" {if(mood > 0) printf(" * :-)");
if(mood == 0) printf(" * :-|");
if(mood < 0) printf(" * :-(");
mood = 0;}
. {ECHO;}
%%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment