Created
January 6, 2018 15:40
-
-
Save msciborski/15e36db45990f6aea653313788e12b0f to your computer and use it in GitHub Desktop.
Lex1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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