sâmbătă, 28 martie 2020

LFA IFR - Compilatoare, Cap al II-lea

Bun venit inapoi din pauza,

Deschideti manualul la pagina 17, la capitolul al doilea.
Pregatiti un folder Lab2 pe sistemul dvs. Linux.

In el vom scrie cod intr-un fisier: simple.y

Analizorul sintactic (Parser-ul)
Cititi definitia de la pagina 17.

Fisierul de intrare pentru Yacc/Bison are urmatoarea structura:

declaratii C si declaratii parser
%%
Regulile gramaticii si actiunile semantice atasate (care vor opera cu a doua stive)
%%
Functii C (adesea aici se include si functia Main, care nu e generat automat)

Spre deosebire de manual, am sa va rog ca in prima parte a fisierului pt. Bison sa includeti urmatoarele declaratii:

%{
#include <stdio.h> /* For I/O */
#include <stdlib.h> /* For malloc here and in symbol table */
#include <string.h> /* For strcmp in symbol table */
#define YYDEBUG 1 /* For Debugging */
int errors; /* Error Count */
%}

Cititi explicatiile de la pg 18 sus ...

Si adaugati declaratiile pentru parserul facut cu Bison:

%start program

%token LET INTEGER IN
%token SKIP IF THEN ELSE END WHILE DO READ WRITE FI

%token NUMBER
%token IDENTIFIER ASSGNOP

%left '-' '+'
%left '*' '/'
%right '^'
%%

Sunt patru feluri de chestiuni explicate aici Bisonului :

1)  Ca simbolul de start al gramaticii este chiar cuvantul program. El spune care este prima regula din gramatica (si ultima folosita la analiza) cand compilatorul recunoaste un program complet, corect scris.
2) Ca exista niste cuvinte cheie pe care le vom nota LET samd ... FI pentru uzul Bisonului. Dar se vor scrie cu minuscule ! De fapt Lex le va recunoaste si putem amana pt atunci decizia daca limbajul va fi case sensitive sau nu.
3) Sunt niste atomi lexicali a caror forma nu o stim exact dar ii numim NUMBER IDENTIFIER ASSGNOP. Lex va fi informat cum sa ii recunoasca si va spune Bisonului ca a gasit unul sau altul dintre ei.
4) Operatiile aritmetice , veti vedea, nu au definita o ordine a prioritatii operatiilor, ea poate fi definita aici. La fel si asociativitatea.

Adaugati regulile gramaticale care descriu limbajul:

program : LET declarations IN commands END ;

declarations : /* empty */
  | INTEGER id seq IDENTIFIER '.'
;

id seq : /* empty */
  | id seq IDENTIFIER ','
;

commands : /* empty */
  | commands command ';'
;

command : SKIP
  | READ IDENTIFIER
  | WRITE exp
  | IDENTIFIER ASSGNOP exp
  | IF exp THEN commands ELSE commands FI
  | WHILE exp DO commands END
;

exp : NUMBER
| IDENTIFIER
| exp '<' exp
| exp '=' exp
| exp '>' exp
| exp '+' exp
| exp '-' exp
| exp '*' exp
| exp '/' exp
| exp '^' exp
| '(' exp ')'
;
%%

Intrebare de control: Cateva grupuri de reguli sau reguli dintre regulile gramaticale de mai sus sunt descrieri inductive  ale unor parti ale limbajuli , le puteti identifica ?

Astept pe e-mail raspunsuri la intrebare.

Intrebare de control: O gramatica e definita teoretic(vezi cursul teoretic) din terminali, neterminali, reguli gramaticale simbol de start. Identificati aceste elemente dintre cele de mai sus.

A treia sectiune cuprinde codul de la pagina 20.
Cateva explicatii:

In C , C++ (si alte cateva limbaje) argc si argv sunt parametri pentru transferul informatiei din linia de comanda catre executabil.
Cand scriu : c:/> compilator.exe p1.sim de fapt transmit un sir de stringuri. In C, stringurile sunt pointeri la caracter si un vector de stringuri este pointer la pointer la caracter.

argc este contorul de argumente , spune cate sunt, iar argv este vectorul de stringuri.

Corectura: La instructiunea care apeleaza fopen, al doilea argument este stringul "r" !!

Intrebare de control: Ce face functia main ?

Procesati fisierul conform indicatiilor de la pagina 21:

Va trebui sa obtineti un avertisment, doar care spune ca sunt un anumit numar de conflicte deplasare reducere, semn ca nu este optimala gramatica.

Sesiunea de lucru este explicata in Anexa 2. (pe la pg 87 depinzand de editie)

Checkpoint: Trimiteti captura de ecran cu rezultatul procesarii fisierului .y cu comanda Bison.

Pauza 10 minute

Adaos ulterior. Nu trimiteti programe in alte limbaje, deocamdata.

Limbajul Simple nu are:
a) Atribuiri cu = ci cu :=.
b) Tipul boolean cu true si false. folositi 0 si 1.
c) Operatorul %.
d) secventa de comenzi nu se scrie in acolada. Vezi anexa A.7.
e) Operatorul && va trebui sa va descurcati cu aritmetica. Not se implementeaza asa: x, not x este 1-x.
f) # comentarii
g) Instructiunea display , se numeste write.

Adaos ulterior:

Limbajul Simple nu are:
a) Liste.
b) Atribuiri cu = ci cu :=
c) Operator %
d) Operator de indexare.
e) Secvente cu acolade.

Vezi exemplu de program in A.7


Niciun comentariu:

Trimiteți un comentariu