Professional Documents
Culture Documents
AUTOR:
Lima Per
INTRODUCCIN
G = { N , T , P , S}
Donde:
Segunda Derivacin:
1 <S> a<S><B>
2
aa<S><B><B>
21 1
2
aab<B><B>
4
aabc<B>
4
aabcc
Luego: L{G} = {b,abc,aabcc, ...}
Derivacin:
<S> m<A><B><C>
4 m<A><B>r
3 m<A>qr
2
mpqr
LENGUAJE FORMAL.
Dado un conjunto de simbolos denominado Alfabeto, un Lenguaje
Formal sobre tal alfabeto, es un conjunto de secuencia de simbolos
del alfabeto.
Ejemplo. Dado el conjunto A={a,b,c} Alfabeto, entonces:
L1={ac,aa,bb} L3={c}
L2={aaa,bc} L4={a,b,c}
Los lenguajes pueden ser Finitos o Infinitos, para fines de estudio nos
basaremos en lenguajes Infinitos.
Solucin
1. <S> a<S>b
2. <S> ab
ac,aa,bb} L3={c}
Obs.
Solucin: 1 <S>
abac
2 3
a <S> <B>
b ac
b4 a <B>
c
c
Podemos concluir que la cadena abac L(G)
<A> a <B><C>
<B> b <B>
<C> c
ii. Los lados izquierdos de las reglas de produccin que tienen igual
s.n.t.,deben empezar, en sus lados derechos, con s.t. diferentes.
<A> a <B><C>
ab
<A> b <C>
<C> c
Ejemplo 1: Es G una gramtica simple?
3. <A>
Solucin
i) No cumple, pues no todos (, de la regla 3) son smbolos terminales
G no es tipo-S
G es tipo-S
Solucin:
Seg (<B>):
1 <S> a<B><S>
1
a<B>a<B><S>
2 <S> a<B><S>
2
a<B>p
Seg(<B>) = {a,p} = A
Seg (<S>):
1 <S> a<B><S>
1
a<B>a<B><S>
Seg(<S>) = { } = B
{b} si P: <X> b
Sel(P) =
Seg(<X>), si P: <X>
Ejemplo: Es G de tipo q.
Donde G:
1. <S> a<A><S>
2. <S> b
3. <A> c<A><S>
4. <A>
Solucin:
Conjunto de Seleccin
Seg (<A>):
1 <S> a<A><S>
1
a<A>a<B><S>
2 <S> a<B><S>
2
a<B>b
Seg(<A>) = {a,b}
G es tipo q.
1. <S> a <A>
2. <A> <A> a
3. <A> a
4. <A>
1 Mtodo 2 Mtodo.
<S> <S>
1 1
a <A> a <A>
2 3
<A> a a
4
G es Ambigua
I.9 TABLAS DE CONTROL
Es aquella tabla que sirve para hacer un anlisis sintctico y generar una
gramtica a partir de los s.t. y s.n.t. que se relacionan en la tabla. Esta
tabla est formada por:
Ejemplo:
Sea la gramtica G:
1. <S> 1<A>1
2. <A> 0<A>
3. <A> 0
Tabla de Control.
1 0
<S> Re (<A>) Rech Rech
Av
<A> Rech Av/pop() Rech
Av
1 Pop() Rech Rech
Av
Rech Rech Aceptar
Ejemplo:
Dado L(G)= {ab, ba}. Su Autmata Finito ser:
1 b
a
0 3
b a
2
Ejemplo:
3) Reglas de la forma :
<S> <A> | <B> | | <N>
Se representa de la siguiente manera:
A
4) Reglas de la forma :
A B N
Se representa por:
Ejemplo: Sea G:
<S> <A>b<A>
<A> <A>a
<A> a
El diagrama ser:
S
S: A b A
A b
A
A:
b
Ej.:
<S> <A><B>
<A> a<B>
<A> m
<B> p<B>
<B> h
G:
1. <E> <T><Lista_E>
2. <Lista_E> +<T><B> (1)
3. <Lista_E>
4. <T> <P><Lista_T>
5. <Lista_T> *<P><Lista_T>
(2)
6. <Lista_T>
7. <P> (<E>)
8. <P> const (3)
Solucin
Si (1), (2) y (3) son conjuntos disjuntos entonces G es de tipo LL(1)
<E>
1
<T> <Lista_E>
4
<P> <Lista_T>
7
( <E> )
1
<T> <Lista_E>
Seg(<Lista_E>) = { ) }
Sel (3) = { ) }
Luego Sel (2) y Sel (3) son disjuntos
II.1 COMPILADORES.
Programa Anlisis
Lexicogrfico
Anlisis
Sintctico
Anlisis
Semntico
Generacin de
Cdigo
Ej:
Sea la siguiente sentencia en Pascal: previo := siguiente cont * 3
<id1> <: => <id2> < + > <id3> < * > <ent>
Debe quedar claro que a largo de estas fases la tabla de smbolos juega
un papel central. Adems, tambin debe incorporarse dentro de este
diseo una buena estrategia para dar informacin sobre los errores
sintcticos o diagnsticos.
1. Ejecutar el D.O.S.
2. Escribir C:\YACC>edit
3. En la pantalla azul que aparece se digitar el cdigo en lenguaje YACC.
4. El archivo deber ser guardado con extensin *. Y
5. Volver a D.O.S. se compila el archivo creado en YACC as: C:\
YACC>yacc *. Y
6. Luego de ello se generar un programa en lenguaje C con el nombre
YTAB.C el cual debe ser compilado en dicho lenguaje presionando CTRL
+ F9.
7. Finalmente, se formar el archivo YTAB.EXE el cual podr ejecutarse y
luego ingresar los datos.
Compilador
Entrada: calc.y Ytab.c
YACC
Compilador
Ytab.c Ytab.exe
C
Datos
Ytab.exe Salida
Token
1. La parte de declaraciones
%{
#include <ctype.h>
int tabla[3];
void setear_valor(char, int);
int buscar_valor(char);
%}
En YACC se escribira
Captulo IV
COMPILADOR DE CALCULADORA
IV.1 GRAMATICA
EDICION DE PROGRAMA DE
GRAMATICA
GRAMATICA EN YACC
%%
lineas : linea lineas 1. <lineas> <linea><lineas>
|
;
linea : expr '\n' { printf("%d\n", $1); } 2. <linea> <expr>\n
| variable '=' expr '\n' { setear_valor($1, $3); } 3. <linea> <VARIABLE>=<EXPR>\n
;
expr : expr '+' termino { $$ = $1 + $3; } 4. <expr> <expr>+<TERMINO>
| expr '-' termino { $$ = $1 - $3; } 5. <EXPR> <expr>-<TERMINO>
| termino 6. <EXPR> <TERMINO>
;
termino: termino '*' factor { $$ = $1 * $3; } 7. <TERMINO> <TERMINO>*<FACTOR>
| termino '/' factor { $$ = $1 / $3; } 8. <TERMINO> <TERMINO>/<FACTOR>
| factor 9. <TERMINO> <FACTOR>
;
factor: '(' expr ')' { $$ = $2; } 10. <factor> (<EXPR>)
| digito 11. <factor> <digito>
| variable { $$ = buscar_valor($1); } 12. <factor> <VARIABLE>
;
digito : '0' { $$ = 0; } 13. <digito> 0
| '1' { $$ = 1; } 14. <digito> 1
| '2' { $$ = 2; } 15. <digito> 2
| '3' { $$ = 3; } 16. <digito> 3
| '4' { $$ = 4; } 17. <digito> 4
| '5' { $$ = 5; } 18. <digito> 5
| '6' { $$ = 6; } 19. <digito> 6
| '7' { $$ = 7; } 20. <digito> 7
| '8' { $$ = 8; } 21. <digito> 8
| '9' { $$ = 9; } 22. <digito> 9
;
%%
Expresion: 2+5*(1+3)+2-3*(2-1)
<LINEA>
<EXPR>
2+5*(1+3)+2-3*(2-1)
<TERMINO> <FACTOR>
2+5*(1+3)+2-3 (2-1)
<EXPR>
<EXPR> <TERMINO> 2-1
2+5*(1+3)+2 3
<EXPR> <TERMINO>
<EXPR> <TERMINO> <FACTOR> 2 1
2+5*(1+3) 2 3
<EXPR> <TERMINO>
<DIGITO> <DIGITO> 1 3
2 5
<TERMINO> <FACTOR>
1 3
<FACTOR> <DIGITO>
1 3
<DIGITO>
2
14
Yacc: calc.y
%{
#include <ctype.h>
int tabla[3];
void setear_valor(char, int);
int buscar_valor(char);
%}
%%
lineas : linea lineas
|
;
linea : expr '\n' { printf("%d\n", $1); }
| variable '=' expr '\n' { setear_valor($1, $3); }
;
expr : expr '+' termino { $$ = $1 + $3; }
| expr '-' termino { $$ = $1 - $3; }
| termino
;
termino: termino '*' factor { $$ = $1 * $3; }
| termino '/' factor { $$ = $1 / $3; }
| factor
;
factor: '(' expr ')' { $$ = $2; }
| digito
| variable { $$ = buscar_valor($1); }
;
digito : '0' { $$ = 0; }
| '1' { $$ = 1; }
| '2' { $$ = 2; }
| '3' { $$ = 3; }
| '4' { $$ = 4; }
| '5' { $$ = 5; }
| '6' { $$ = 6; }
| '7' { $$ = 7; }
| '8' { $$ = 8; }
| '9' { $$ = 9; }
;
%%
yylex() {
return(getchar());
}
yyerror() {
printf("Error\n");
}
main() {
yyparse();
int buscar_valor(char c) {
return(tabla[c - 'a']);
}
# line 2 "calc.y"
#include <ctype.h>
int tabla[3];
void setear_valor(char, int);
int buscar_valor(char);
#define yyclearin yychar = -1
#define yyerrok yyerrflag = 0
extern int yychar;
extern short yyerrflag;
#ifndef YYMAXDEPTH
#define YYMAXDEPTH 150
#endif
#ifndef YYSTYPE
#define YYSTYPE int
#endif
YYSTYPE yylval, yyval;
# define YYERRCODE 256
# line 45 "calc.y"
yylex() {
return(getchar());
}
yyerror() {
printf("Error\n");
}
main() {
yyparse();
}
int buscar_valor(char c) {
return(tabla[c - 'a']);
}
short yyexca[] ={
-1, 1,
0, -1,
-2, 0,
};
# define YYNPROD 27
# define YYLAST 60
hort yyact[]={
0, 1, 1, 2, 2, 3, 3, 3, 5, 5,
5, 6, 6, 6, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 4, 4, 4 };
short yyr2[]={
0, 2, 0, 2, 4, 3, 3, 1, 3, 3,
1, 3, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1 };
short yychk[]={
-1000, -1, -2, -3, -4, -5, 97, 98, 99, -6,
40, -7, 48, 49, 50, 51, 52, 53, 54, 55,
56, 57, -1, 10, 43, 45, 61, 42, 47, -3,
-4, -5, -5, -3, -6, -6, 41, 10 };
short yydef[]={
#ifdef YYDEBUG
int yydebug = 0; /* 1 for debugging */
#endif
yyparse() {
short yys[YYMAXDEPTH];
short yyj, yym;
register YYSTYPE *yypvt;
register short yystate, *yyps, yyn;
register YYSTYPE *yypv;
register short *yyxi;
yystate = 0;
yychar = -1;
yynerrs = 0;
yyerrflag = 0;
yyps= &yys[-1];
yypv= &yyv[-1];
#ifdef YYDEBUG
if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
#endif
if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" );
return(1); }
*yyps = yystate;
++yypv;
*yypv = yyval;
yynewstate:
yyn = yypact[yystate];
yydefault:
/* default state action */
if( (yyn=yydef[yystate]) == -2 ) {
if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
/* look through exception table */
}
if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
}
switch( yyerrflag ){
case 1:
case 2: /* incompletely recovered error ... try again */
yyerrflag = 3;
#ifdef YYDEBUG
if( yydebug ) printf( "error recovery pops state %d,
uncovers %d\n", *yyps, yyps[-1] );
#endif
--yyps;
--yypv;
}
yyabort:
return(1);
#ifdef YYDEBUG
if( yydebug ) printf( "error recovery discards char
%d\n", yychar );
#endif
#ifdef YYDEBUG
if( yydebug ) printf("reduce %d\n",yyn);
#endif
yyps -= yyr2[yyn];
yypvt = yypv;
yypv -= yyr2[yyn];
yyval = yypv[1];
yym=yyn;
/* consult goto table to find next state */
yyn = yyr1[yyn];
yyj = yypgo[yyn] + *yyps + 1;
if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn )
yystate = yyact[yypgo[yyn]];
switch(yym){
case 3:
# line 12 "calc.y"
{ printf("%d\n", yypvt[-1]); } break;
case 4:
# line 13 "calc.y"
{ setear_valor(yypvt[-3], yypvt[-1]); } break;
case 5:
# line 15 "calc.y"
{ yyval = yypvt[-2] + yypvt[-0]; } break;
case 6:
# line 16 "calc.y"
{ yyval = yypvt[-2] - yypvt[-0]; } break;
case 8:
# line 19 "calc.y"
{ yyval = yypvt[-2] * yypvt[-0]; } break;
case 9:
# line 20 "calc.y"
{ yyval = yypvt[-2] / yypvt[-0]; } break;
case 11:
# line 23 "calc.y"
{ yyval = yypvt[-1]; } break;
case 13:
# line 25 "calc.y"
{ yyval = buscar_valor(yypvt[-0]); } break;
case 14:
# line 28 "calc.y"
{ yyval = 0; } break;
case 15:
# line 29 "calc.y"
{ yyval = 1; } break;
case 16:
# line 30 "calc.y"
{ yyval = 2; } break;
case 17:
# line 31 "calc.y"
{ yyval = 3; } break;
case 18:
# line 32 "calc.y"
{ yyval = 4; } break;
case 19:
# line 33 "calc.y"
{ yyval = 5; } break;
case 20:
# line 34 "calc.y"
{ yyval = 6; } break;
case 21:
# line 35 "calc.y"
{ yyval = 7; } break;
case 22:
# line 36 "calc.y"
{ yyval = 8; } break;
case 23:
# line 37 "calc.y"
{ yyval = 9; } break;
case 24:
# line 40 "calc.y"
{ yyval = 'a'; } break;
case 25:
# line 41 "calc.y"
{ yyval = 'b'; } break;
case 26:
# line 42 "calc.y"
{ yyval = 'c'; } break;
}
goto yystack; /* stack new state and value */
YaccEditor es un editor para TP. Yacc incluye una funcin para mostrar
grficamente la lista de estados adems de la lista de estados en un formato
TXT (texto), que se obtienen al aplicar la tcnica LALR
decir, las reglas del kernel o ncleo, las respectivas reglas de la clausura,
todos los goto o saltos con sus respectivos smbolos y, adems,
informacin de los conflicto en caso de que el estado tenga alguno.
Este grfico muestra todos los estados (en forma de crculos), los
smbolos con los que se realizan las transiciones y hacia que estados se
efectan los mismos.
estado 0
Ncleo:
regla 0: dist0 --> _lineas '$' ;
clausura:
regla 1: lineas --> _linea lineas ; '$'
regla 2: lineas --> _ ; '$' reducir por regla borradora(2)
regla 3: linea --> _expr '\n' ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
regla 4: linea --> _variable '=' expr '\n' ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
regla 5: expr --> _expr '+' termino ; '\n' '+' '-'
regla 6: expr --> _expr '-' termino ; '\n' '+' '-'
regla 7: expr --> _termino ; '\n' '+' '-'
regla 24: variable --> _'a' ; '='
regla 25: variable --> _'b' ; '='
regla 26: variable --> _'c' ; '='
regla 8: termino --> _termino '*' factor ; '\n' '+' '-' '*' '/'
regla 9: termino --> _termino '/' factor ; '\n' '+' '-' '*' '/'
regla 10: termino --> _factor ; '\n' '+' '-' '*' '/'
regla 11: factor --> _'(' expr ')' ; '\n' '+' '-' '*' '/'
regla 12: factor --> _digito ; '\n' '+' '-' '*' '/'
regla 13: factor --> _variable ; '\n' '+' '-' '*' '/'
regla 14: digito --> _'0' ; '\n' '+' '-' '*' '/'
regla 15: digito --> _'1' ; '\n' '+' '-' '*' '/'
regla 16: digito --> _'2' ; '\n' '+' '-' '*' '/'
regla 17: digito --> _'3' ; '\n' '+' '-' '*' '/'
regla 18: digito --> _'4' ; '\n' '+' '-' '*' '/'
regla 19: digito --> _'5' ; '\n' '+' '-' '*' '/'
regla 20: digito --> _'6' ; '\n' '+' '-' '*' '/'
regla 21: digito --> _'7' ; '\n' '+' '-' '*' '/'
regla 22: digito --> _'8' ; '\n' '+' '-' '*' '/'
regla 23: digito --> _'9' ; '\n' '+' '-' '*' '/'
estado 1
Ncleo:
regla 0: dist0 --> lineas _'$' ;
estado 2
Ncleo:
regla 0: dist0 --> lineas '$' _ ; "aceptar" (reducir por regla) (0)
estado 3
Ncleo:
regla 1: lineas --> linea _lineas ; '$'
clausura:
regla 1: lineas --> _linea lineas ; '$'
regla 2: lineas --> _ ; '$' reducir por regla borradora(2)
regla 3: linea --> _expr '\n' ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
regla 4: linea --> _variable '=' expr '\n' ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
regla 5: expr --> _expr '+' termino ; '\n' '+' '-' ')' '+' '-'
regla 6: expr --> _expr '-' termino ; '\n' '+' '-'
regla 7: expr --> _termino ; '\n' '+' '-'
regla 24: variable --> _'a' ; '='
regla 25: variable --> _'b' ; '='
regla 26: variable --> _'c' ; '='
regla 8: termino --> _termino '*' factor ; '\n' '+' '-' '*' '/'
regla 9: termino --> _termino '/' factor ; '\n' '+' '-' '*' '/'
regla 10: termino --> _factor ; '\n' '+' '-' '*' '/'
regla 11: factor --> _'(' expr ')' ; '\n' '+' '-' '*' '/'
regla 12: factor --> _digito ; '\n' '+' '-' '*' '/'
regla 13: factor --> _variable ; '\n' '+' '-' '*' '/'
regla 14: digito --> _'0' ; '\n' '+' '-' '*' '/'
regla 15: digito --> _'1' ; '\n' '+' '-' '*' '/'
regla 16: digito --> _'2' ; '\n' '+' '-' '*' '/'
regla 17: digito --> _'3' ; '\n' '+' '-' '*' '/'
regla 18: digito --> _'4' ; '\n' '+' '-' '*' '/'
regla 19: digito --> _'5' ; '\n' '+' '-' '*' '/'
regla 20: digito --> _'6' ; '\n' '+' '-' '*' '/'
regla 21: digito --> _'7' ; '\n' '+' '-' '*' '/'
regla 22: digito --> _'8' ; '\n' '+' '-' '*' '/'
regla 23: digito --> _'9' ; '\n' '+' '-' '*' '/'
estado 4
Ncleo:
regla 1: lineas --> linea lineas _ ; '$' reducir por regla (1)
estado 5
Ncleo:
regla 3: linea --> expr _'\n' ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
regla 5: expr --> expr _'+' termino ; '\n' '+' '-' ')' '+' '-'
regla 6: expr --> expr _'-' termino ; '\n' '+' '-'
estado 6
Ncleo:
regla 3: linea --> expr '\n' _ ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' reducir por regla (3)
estado 7
Ncleo:
regla 5: expr --> expr '+' _termino ; '\n' '+' '-' ')' '+' '-'
clausura:
regla 8: termino --> _termino '*' factor ; '\n' '+' '-' '*' '/' ')' '+' '-' '*' '/'
regla 9: termino --> _termino '/' factor ; '\n' '+' '-' '*' '/'
regla 10: termino --> _factor ; '\n' '+' '-' '*' '/'
regla 11: factor --> _'(' expr ')' ; '\n' '+' '-' '*' '/'
regla 12: factor --> _digito ; '\n' '+' '-' '*' '/'
regla 13: factor --> _variable ; '\n' '+' '-' '*' '/'
regla 14: digito --> _'0' ; '\n' '+' '-' '*' '/'
regla 15: digito --> _'1' ; '\n' '+' '-' '*' '/'
regla 16: digito --> _'2' ; '\n' '+' '-' '*' '/'
regla 17: digito --> _'3' ; '\n' '+' '-' '*' '/'
regla 18: digito --> _'4' ; '\n' '+' '-' '*' '/'
regla 19: digito --> _'5' ; '\n' '+' '-' '*' '/'
regla 20: digito --> _'6' ; '\n' '+' '-' '*' '/'
regla 21: digito --> _'7' ; '\n' '+' '-' '*' '/'
regla 22: digito --> _'8' ; '\n' '+' '-' '*' '/'
regla 23: digito --> _'9' ; '\n' '+' '-' '*' '/'
regla 24: variable --> _'a' ; '\n' '+' '-' '*' '/'
regla 25: variable --> _'b' ; '\n' '+' '-' '*' '/'
regla 26: variable --> _'c' ; '\n' '+' '-' '*' '/'
estado 8
Ncleo:
regla 5: expr --> expr '+' termino _ ; '\n' '+' '-' ')' '+' '-' reducir por regla (5)
regla 8: termino --> termino _'*' factor ; '\n' '+' '-' '*' '/' ')' '+' '-' '*' '/'
regla 9: termino --> termino _'/' factor ; '\n' '+' '-' '*' '/'
estado 9
Ncleo:
regla 8: termino --> termino '*' _factor ; '\n' '+' '-' '*' '/' ')' '+' '-' '*' '/'
clausura:
regla 11: factor --> _'(' expr ')' ; '\n' '+' '-' '*' '/' ')' '+' '-' '*' '/'
regla 12: factor --> _digito ; '\n' '+' '-' '*' '/'
regla 13: factor --> _variable ; '\n' '+' '-' '*' '/'
regla 14: digito --> _'0' ; '\n' '+' '-' '*' '/'
regla 15: digito --> _'1' ; '\n' '+' '-' '*' '/'
regla 16: digito --> _'2' ; '\n' '+' '-' '*' '/'
regla 17: digito --> _'3' ; '\n' '+' '-' '*' '/'
regla 18: digito --> _'4' ; '\n' '+' '-' '*' '/'
regla 19: digito --> _'5' ; '\n' '+' '-' '*' '/'
regla 20: digito --> _'6' ; '\n' '+' '-' '*' '/'
regla 21: digito --> _'7' ; '\n' '+' '-' '*' '/'
regla 22: digito --> _'8' ; '\n' '+' '-' '*' '/'
regla 23: digito --> _'9' ; '\n' '+' '-' '*' '/'
regla 24: variable --> _'a' ; '\n' '+' '-' '*' '/' '='
regla 25: variable --> _'b' ; '\n' '+' '-' '*' '/' '='
regla 26: variable --> _'c' ; '\n' '+' '-' '*' '/' '='
estado 10
Ncleo:
regla 8: termino --> termino '*' factor _ ; '\n' '+' '-' '*' '/' ')' '+' '-' '*' '/' reducir por regla (8)
estado 11
Ncleo:
regla 11: factor --> '(' _expr ')' ; '\n' '+' '-' '*' '/' ')' '+' '-' '*' '/'
clausura:
regla 5: expr --> _expr '+' termino ; ')' '+' '-'
regla 6: expr --> _expr '-' termino ; ')' '+' '-' '\n' '+' '-'
regla 7: expr --> _termino ; ')' '+' '-' '\n' '+' '-'
regla 8: termino --> _termino '*' factor ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 9: termino --> _termino '/' factor ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 10: termino --> _factor ; ')' '+' '-' '*' '/'
regla 11: factor --> _'(' expr ')' ; ')' '+' '-' '*' '/'
regla 12: factor --> _digito ; ')' '+' '-' '*' '/'
regla 13: factor --> _variable ; ')' '+' '-' '*' '/'
regla 14: digito --> _'0' ; ')' '+' '-' '*' '/'
regla 15: digito --> _'1' ; ')' '+' '-' '*' '/'
regla 16: digito --> _'2' ; ')' '+' '-' '*' '/'
regla 17: digito --> _'3' ; ')' '+' '-' '*' '/'
regla 18: digito --> _'4' ; ')' '+' '-' '*' '/'
regla 19: digito --> _'5' ; ')' '+' '-' '*' '/'
regla 20: digito --> _'6' ; ')' '+' '-' '*' '/'
regla 21: digito --> _'7' ; ')' '+' '-' '*' '/'
regla 22: digito --> _'8' ; ')' '+' '-' '*' '/'
regla 23: digito --> _'9' ; ')' '+' '-' '*' '/'
regla 24: variable --> _'a' ; ')' '+' '-' '*' '/'
regla 25: variable --> _'b' ; ')' '+' '-' '*' '/'
regla 26: variable --> _'c' ; ')' '+' '-' '*' '/'
estado 12
Ncleo:
regla 11: factor --> '(' expr _')' ; '\n' '+' '-' '*' '/' ')' '+' '-' '*' '/'
estado 13
Ncleo:
regla 11: factor --> '(' expr ')' _ ; '\n' '+' '-' '*' '/' ')' '+' '-' '*' '/' reducir por regla (11)
estado 14
Ncleo:
regla 6: expr --> expr '-' _termino ; ')' '+' '-' '\n' '+' '-'
clausura:
regla 8: termino --> _termino '*' factor ; ')' '+' '-' '*' '/'
regla 9: termino --> _termino '/' factor ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 10: termino --> _factor ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 11: factor --> _'(' expr ')' ; ')' '+' '-' '*' '/'
regla 12: factor --> _digito ; ')' '+' '-' '*' '/'
regla 13: factor --> _variable ; ')' '+' '-' '*' '/'
regla 14: digito --> _'0' ; ')' '+' '-' '*' '/'
regla 15: digito --> _'1' ; ')' '+' '-' '*' '/'
regla 16: digito --> _'2' ; ')' '+' '-' '*' '/'
regla 17: digito --> _'3' ; ')' '+' '-' '*' '/'
regla 18: digito --> _'4' ; ')' '+' '-' '*' '/'
regla 19: digito --> _'5' ; ')' '+' '-' '*' '/'
regla 20: digito --> _'6' ; ')' '+' '-' '*' '/'
regla 21: digito --> _'7' ; ')' '+' '-' '*' '/'
regla 22: digito --> _'8' ; ')' '+' '-' '*' '/'
regla 23: digito --> _'9' ; ')' '+' '-' '*' '/'
regla 24: variable --> _'a' ; ')' '+' '-' '*' '/'
regla 25: variable --> _'b' ; ')' '+' '-' '*' '/'
regla 26: variable --> _'c' ; ')' '+' '-' '*' '/'
estado 15
Ncleo:
regla 6: expr --> expr '-' termino _ ; ')' '+' '-' '\n' '+' '-' reducir por regla (6)
regla 8: termino --> termino _'*' factor ; ')' '+' '-' '*' '/'
regla 9: termino --> termino _'/' factor ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
estado 16
Ncleo:
regla 9: termino --> termino '/' _factor ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
clausura:
regla 11: factor --> _'(' expr ')' ; ')' '+' '-' '*' '/'
regla 12: factor --> _digito ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 13: factor --> _variable ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 14: digito --> _'0' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 15: digito --> _'1' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 16: digito --> _'2' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 17: digito --> _'3' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 18: digito --> _'4' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 19: digito --> _'5' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 20: digito --> _'6' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 21: digito --> _'7' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 22: digito --> _'8' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 23: digito --> _'9' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 24: variable --> _'a' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' '='
regla 25: variable --> _'b' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' '='
regla 26: variable --> _'c' ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' '='
estado 17
Ncleo:
regla 9: termino --> termino '/' factor _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (9)
estado 18
Ncleo:
regla 12: factor --> digito _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (12)
estado 19
Ncleo:
regla 13: factor --> variable _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (13)
estado 20
Ncleo:
regla 14: digito --> '0' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (14)
estado 21
Ncleo:
regla 15: digito --> '1' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (15)
estado 22
Ncleo:
regla 16: digito --> '2' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (16)
estado 23
Ncleo:
regla 17: digito --> '3' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (17)
estado 24
Ncleo:
regla 18: digito --> '4' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (18)
estado 25
Ncleo:
regla 19: digito --> '5' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (19)
estado 26
Ncleo:
regla 20: digito --> '6' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (20)
estado 27
Ncleo:
regla 21: digito --> '7' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (21)
estado 28
Ncleo:
regla 22: digito --> '8' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (22)
estado 29
Ncleo:
regla 23: digito --> '9' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (23)
estado 30
Ncleo:
regla 24: variable --> 'a' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' '=' reducir por regla (24)
estado 31
Ncleo:
regla 25: variable --> 'b' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' '=' reducir por regla (25)
estado 32
Ncleo:
regla 26: variable --> 'c' _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' '=' reducir por regla (26)
estado 33
Ncleo:
regla 10: termino --> factor _ ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/' reducir por regla (10)
estado 34
Ncleo:
regla 7: expr --> termino _ ; ')' '+' '-' '\n' '+' '-' reducir por regla (7)
regla 8: termino --> termino _'*' factor ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
regla 9: termino --> termino _'/' factor ; ')' '+' '-' '*' '/' '\n' '+' '-' '*' '/'
estado 35
Ncleo:
regla 4: linea --> variable _'=' expr '\n' ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
regla 13: factor --> variable _ ; '\n' '+' '-' '*' '/' reducir por regla (13)
estado 36
Ncleo:
regla 4: linea --> variable '=' _expr '\n' ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
clausura:
regla 5: expr --> _expr '+' termino ; '\n' '+' '-'
regla 6: expr --> _expr '-' termino ; '\n' '+' '-'
regla 7: expr --> _termino ; '\n' '+' '-'
regla 8: termino --> _termino '*' factor ; '\n' '+' '-' '*' '/'
regla 9: termino --> _termino '/' factor ; '\n' '+' '-' '*' '/'
regla 10: termino --> _factor ; '\n' '+' '-' '*' '/'
regla 11: factor --> _'(' expr ')' ; '\n' '+' '-' '*' '/'
regla 12: factor --> _digito ; '\n' '+' '-' '*' '/'
regla 13: factor --> _variable ; '\n' '+' '-' '*' '/'
regla 14: digito --> _'0' ; '\n' '+' '-' '*' '/'
regla 15: digito --> _'1' ; '\n' '+' '-' '*' '/'
regla 16: digito --> _'2' ; '\n' '+' '-' '*' '/'
regla 17: digito --> _'3' ; '\n' '+' '-' '*' '/'
regla 18: digito --> _'4' ; '\n' '+' '-' '*' '/'
regla 19: digito --> _'5' ; '\n' '+' '-' '*' '/'
regla 20: digito --> _'6' ; '\n' '+' '-' '*' '/'
regla 21: digito --> _'7' ; '\n' '+' '-' '*' '/'
regla 22: digito --> _'8' ; '\n' '+' '-' '*' '/'
regla 23: digito --> _'9' ; '\n' '+' '-' '*' '/'
regla 24: variable --> _'a' ; '\n' '+' '-' '*' '/'
regla 25: variable --> _'b' ; '\n' '+' '-' '*' '/'
regla 26: variable --> _'c' ; '\n' '+' '-' '*' '/'
estado 37
Ncleo:
regla 4: linea --> variable '=' expr _'\n' ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
regla 5: expr --> expr _'+' termino ; '\n' '+' '-'
regla 6: expr --> expr _'-' termino ; '\n' '+' '-'
estado 38
Ncleo:
regla 4: linea --> variable '=' expr '\n' _ ; 'a' 'b' 'c' '(' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' reducir por
regla (4)
( + - * / ) a b c = 0 1 2 3 4 5 6 7 8 9 Total
Estado
s.t.
0 11 - - - - - 30 31 32 - 20 21 22 23 24 25 26 27 28 29 14
3 11 - - - - - 30 31 32 - 20 21 22 23 24 25 26 27 28 29 14
5 - 7 14 - - - - - - - - - - - - - - - - - 2
7 11 - - - - - 30 31 32 - 20 21 22 23 24 25 26 27 28 29 14
8 - - - 9 16 - - - - - - - - - - - - - - - 2
9 11 - - - - - 30 31 32 - 20 21 22 23 24 25 26 27 28 29 14
11 11 - - - - - - - - - 20 21 22 23 24 25 26 27 28 29 11
12 - 7 14 - - 13 - - - - - - - - - - - - - - 3
14 11 - - - - - 30 31 32 - 20 21 22 23 24 25 26 27 28 29 14
15 - - - 9 16 - - - - - - - - - - - - - - - 2
16 11 - - - - - 30 31 32 - 20 21 22 23 24 25 26 27 28 29 14
34 - - - 9 16 - - - - - - - - - - - - - - - 2
35 - - - - - - - - - 36 - - - - - - - - - - 1
36 11 - - - - - 30 31 32 - 20 21 22 23 24 25 26 27 28 29 14
37 - 7 14 - - - - - - - - - - - - - - - - - 2
Total 8 3 3 3 3 1 7 7 7 1 8 8 8 8 8 8 8 8 8 8 123
expr
linea
variable = expr
expr + termino
termino
termino * factor
factor
( expr )
factor digito
variable
1
digito
variable b