Documente Academic
Documente Profesional
Documente Cultură
Limbaje de tipul 3
Gramatici regulate
Automate finite
Deterministe
Nedeterministe
Expresii regulate
a, a , ,
E1.E2, E1|E2, E1*, (E1)
Istoric
Paii compilrii
Analiza lexical
Descriere lexical
Interpretare
Interpretare orientat dreapta
Descriere lexical bine format
Lex
Uniti
lexicale
Caractere
Cod
surs
Analizor
lexical
Arbore
sintactic
Analizor
sintactic
Analizor
semantic
Arbore
sintactic
decorat
Generator
de cod
Cod main
Asamblare
Cod
intermediar
Interpretare
litera a | b ||z
cifra 0 | 1 || 9
identificator litera (litera| cifra)*
semn + | numar (semn | ) cifra+
operator + | -| * | / | < | > | <= | >= | < >
asignare :=
doua_puncte :
cuvinte_rezervate if| then|else
paranteze ) | (
Ai
An
Ao
q0
Aa
Ad
Ac
Ap
liter, cifr
liter
1
cifr
cifr
cifr
#o
operator {+,-}
#o
:
5
#n
+,-
),(
#i sau #c
6
7
#a
#d
#p
Cod surs C
executabil
lex.yy.c
lex ll fisier.l
a.out
gcc lex.yy.c
Declaraiile conin
Declaraii C, ntre secvenele rezervate %{, %}
Definiii Lex pentru segmentul de reguli
cifra [0-9]
litera [a-zA-Z]
Simbol
Descriere
secven escape
negaie
a|b
a sau b
()
grupare de caractere
a+b
literalul"a+b
[]
clasa de caractere
Expresia
abc
abc*
abc+
a(bc)+
a(bc)?
[abc]
[a-z]
[a\-z]
[-az]
[A-Za-z0-9]+
[ \t\n]+
[^ab]
[a^b]
[a|b]
a|b
Candidai ce se potrivesc
abc
ab abc abcc abccc ...
abc abcc abccc ...
abc abcbc abcbcbc ...
a abc
unul dintre caracterele: a, b, c
orice liter mic
unul din caracterele: a, -, z
unul din caracterele: -, a, z
unul sau mai multe caractere alfanumerice
spaii
orice cu excepia caracterelor: a, b
unul din caracterele : a, ^, b
unul din caracterele : a, |, b
unul din caracterele : a, b
Seciunea de reguli
exp_1
exp_2
.
.
.
exp_n
{Aciune_1}
{Aciune_2}
{Aciune_n}
Nume
Descriere
int yylex(void)
char *yytext
yyleng
yylval
FILE *yyout
fiierul de ieire
FILE *yyin
fiierul de intrare
%{
int yylineno;
%}
%%
^(.*)\n printf("%4d\t%s", ++yylineno, yytext);
%%
int main(int argc, char *argv[]) {
yyin = fopen(argv[1], "r");
yylex();
fclose(yyin);
}
letter [A-Za-z]
digit [0-9]
%{
int count;
%}
%%
{letter}({letter}|{digit})* {count++;}
.{}
%%
int main(void) {
yylex();
printf("number of identifiers = %d\n", count);
return 0;
}
%{
int nchar, nword, nline;
%}
%%
\n { nline++; nchar++; }
[^ \t\n]+ { nword++, nchar += yyleng; }
. { nchar++; }
%%
int main(void) {
yylex();
printf("%d\t%d\t%d\n", nchar, nword, nline);
return 0;
}
%{
# include <stdio.h>
%}
litera [a-zA-Z]
cifra [0-9]
cifre ({cifra})+
semn [+-]
operator [+*/<>=-]
spatiu [' \t\n]
%%
"if" | "then" | "else
({litera})({litera}|{cifra})*
{cifre}|({semn})({cifre})
{operator}
\:\=
\:
(\()|(\))
{spatiu}
.
%%
int main( ){
yylex( );
return 0;
}
{printf("%s
{printf("%s
{printf("%s
{printf("%c
{printf("%s
{printf("%c
{printf("%c
{}
{printf("%c