no_4.asll1

67
7/15/2019 no_4.asll1 http://slidepdf.com/reader/full/no4asll1 1/67 Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 1  Lección 4: Análisis Sintáctico LL(1) 1) Estrategias para el Análisis Sintáctico 2) Análisis Sintáctico descendente 3) Factorización a izda. de gramáticas 4) Eliminación de la recursividad a izda. 5) Construcción de Analizadores Sintácticos predictivos 6) Construcción de Analizadores Sintácticos predictivos no recursivos 7) Construcción de una tabla para el análisis sintáctico predictivo 8) Sobre recuperación de errores en el análisis sintáctico predictivo

Transcript of no_4.asll1

Page 1: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 1/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 1

 Lección 4: Análisis Sintáctico LL(1)

1) Estrategias para el Análisis Sintáctico

2) Análisis Sintáctico descendente

3) Factorización a izda. de gramáticas

4) Eliminación de la recursividad a izda.

5) Construcción de Analizadores Sintácticos predictivos

6) Construcción de Analizadores Sintácticos predictivos norecursivos

7) Construcción de una tabla para el análisis sintáctico predictivo

8) Sobre recuperación de errores en el análisis sintáctico predictivo

Page 2: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 2/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 2

 Estrategias para analizadores sintácticos

• El analizador sintáctico debe verificar si la entrada corresponde aalguna derivación de S

• Primera aproximación: “a lo bestia”

– generar todas las derivaciones de S posibles– comprobar si la entrada corresponde con alguna de ellas

• Inviable, incluso para gramáticas muy sencillas

• Son necesarias estrategias más “astutas”• Las estrategias son de dos categorías:

– análisis DESCENDENTE (Top-Down)

» construye el árbol desde la raíz (S) hasta llegar a las hojas

– análisis ASCENDENTE (Bottom-Up)

» construye el árbol desde las hojas hacia la raíz (S)

Page 3: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 3/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 3

 Estrategias para analizadores sintácticos

• A distintos tipos de analizadores se les da nombres en función avarios elementos:

– lectura de tokens (izda. a dcha., viceversa)

– método de derivación (izda. o dcha.)– número de tokens de pre-análisis (look-ahead)

• Las más comunes:

LL(k)

LL(k)

l ect ur a det okens

“l ef t t o r i ght ”

der i vaci ón pori zda.

k t okens de l ook-ahead

LR(k)

LR(k)

l ect ur a det okens

“l ef t t o r i ght ”

der i vaci ón pordcha.

k t okens de l ook-ahead

Page 4: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 4/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 4

 Estrategias para analizadores sintácticos

• Propiedades deseables en un analizador sintáctico– eficiente

» en general, se buscarán polinomiales en el tamaño del programa a

reconocer– determinar la acción reconociendo unos pocos tokens de entrada

» como máximo, un k preestablecido

» en la práctica, suele ser k=1

– no necesitar “marcha atrás” (backtracking)

» i.e., evitar decisiones

» las acciones semánticas son difíciles de deshacer

– no ocupar mucha memoria

» actualmente, esto no es tan importante

Page 5: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 5/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 5

 Análisis descendente

• Básicamente, es un intento de encontrar una derivación por laizda.

• Desde el punto de vista del árbol de sintaxis, correspondería a un

recorrido en pre-orden• Método:

– Objetivo: reconocer S

– Método:» se divide el objetivo en subobjetivos

(de acuerdo a las producciones)

» se trata de cumplir cada subobjetivo

» se sigue con cada subobjetivo, hasta que se encuentren concordanciasde terminales (o se detecte un error)

Page 6: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 6/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 6

 Análisis descendente

• Ejemplo:

S → cAd

A → ab| a

cad

c a d

SS

S

c A d

c a dS

c A da b

c a d

S

c A d

a b

S

c dc a d

S

c A da

c a dS

c A d

a

c a d

Page 7: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 7/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 7

 Análisis descendente

• Sobre implementación de analizadores descendentes– la forma más natural es asociar un procedimiento con cada no terminal

– cada procedimiento:

» comprueba la corrección del token en estudio con el que el propioprocedimiento representa

• incorrecto: mensaje de error y/o estrategia de recuperación

» hacer avanzar al siguiente token

– afinando un poco más:

» no terminal: genera invocaciones

» terminal: concordancia entre terminales

• error sintáctico ó• avanzar a token siguiente

Page 8: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 8/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 8

 Análisis descendente

• Un ejemplo muy sencilloint el Token;int yyl ex( ) {

return(getchar());

}

void t er mi nal ( int t ) {if( el Token==t )

el Token=yyl ex( ) ;elseer r or Si nt act i co( ) ;

}void A(){

t er mi nal ( ( int) ’ a ’ ) ;}

void S(){t er mi nal ( ( int) ’ c ’ ) ;A();

t er mi nal ( ( int) ’ d’ ) ;}void mai n( ) {

el Token=yyl ex( ) ;S( ) ;

}

S → cAd

A → a

¿Qué pasa con

?

S → cAd

A → a| ab

S → cAdA → a| ab

Page 9: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 9/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 9

 Análisis descendente

• Una solución predictivaint el Token;int yyl ex( ) {

return(getchar());

}

void t er mi nal ( int t ) {if( el Token==t )

el Token=yyl ex( ) ;elseer r or Si nt act i co( ) ;

}void A(){

t er mi nal ( ( int) ’ a’ ) ;if( el Token==( int) ’ b’ )

t er mi nal ( ( int) ’ b’ ) ;}

void S(){t er mi nal ( ( int) ’ c ’ ) ;A();

t er mi nal ( ( int) ’ d’ ) ;}void mai n( ) {

el Token=yyl ex( ) ;S( ) ;

}

S → cAd

A → a| ab

preanálisis

Page 10: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 10/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 10

 Análisis descendente. Un ejemplo

• Ejemplo: Se desea construir un analizador sintáctico para lasiguiente gramática

• donde:– “opas” es un terminal de la gramática que representa al operador de

asignación.» Corresponde al lexema “:=“

– “i dent i f i cador ”

(letra seguido de letras o dígitos)

instruccion → identificador opas expr ‘;’

expr → termino expr ’

expr’ → ‘+’ termino expr ’ | ε 

termino → identificador | ‘(’ expr ‘)’

Page 11: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 11/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 11

 Análisis descendente. Un ejemplo

• Como paso previo, necesitamos construir el analizador léxico• Esquema del proceso:

t okens. hl exDescen. l

si nDescen. c

f l ex

l ex. yy. c

- l ll ex. yy. o si nDescen. o

gcc

gcc

el Anal i zador

Page 12: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 12/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 12

 Análisis descendente. Un ejemplo

enum{ASIGNACION=257,IDENTIFICADOR}; t okens. h

%{#include <stdio.h>#include "tokens.h"

extern char yytext[]; /*ó extern char *yytext*/

%}/*EXPRESIONES REGULARES*/

separador [\t \n]+ /*tabs,blancos*/

letra [a-zA-Z]digito [0-9]identificador {letra}({letra}|{digito})*%%{separador} {/*me los como*/}

":=" {return(ASIGNACION);}{identificador} {return(IDENTIFICADOR);}. {return(yytext[0]);}%%

/* no hay funciones de usuario */

l exDescen. l

Page 13: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 13/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 13

 Análisis descendente. Un ejemplo

• Para el analizador sintáctico, construi remos un

• Ideas básicas del método:– construir un conjunto de procedimientos (recursivos si necesario)

» uno por cada no terminal de la gramática

– cada procedimiento:

» determina la producción a aplicar

» invoca los proc. correspondientes

» detecta error o pasa al siguiente token

– la secuencia de invocaciones a los procedimientos define implícitamenteel árbol de sintaxis

• En este ejemplo funciona bien por las razones que veremos, perono siempre es tan sencillo

analizador sintáctico descendente recursivo

Page 14: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 14/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 14

 Análisis descendente. Un ejemplo

#include <st di o. h>#include " t okens. h"int el Token; / *gl obal con si g. t oken*/void terminal(int token{if( el Token==t oken)

el Token=yyl ex( ) ;else

hayError( ...INFO(elToken) inesperado...) ;}

void instruccion(){t er mi nal ( I DENTI FI CADOR) ;t er mi nal ( ASI GNACI ON) ;expr esi on( ) ;t er mi nal ( ( i nt ) ‘ ; ’ ) ;

}void main(){

el Token=yyl ex( ) ;i nst r ucci on( ) ;

}

si nDescen. c

instruccion →identificador 

opas

expresion ‘;’

Page 15: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 15/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 15

 Análisis descendente. Un ejemplo

void termino(){if( el Token==I DENTI FI CADOR)

t er mi nal ( I DENTI FI CADOR) ;else if( el Token==' ( ' ) {t er mi nal ( ( int) ‘ ( ‘ ) ;expr esi on( ) ;t er mi nal ( ( int) ‘ ) ‘ ) ;

}elsehayEr r or ( "Se esper aba un I DENTI FI CADOR o ' ( ' " ) ;

}

si nDescen. c

termino → identificador

| ( expr esi on )

Page 16: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 16/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 16

 Análisis descendente. Un ejemplo

void expresion(){t er mi no( ) ;expr esi onP( ) ;

}

void expresionP(){if( el Token==' +' ) {

t er mi nal ( ( int) ‘ +‘ ) ;t er mi no( ) ; expr esi onP( ) ;

} / *el se: cor r esponde a ε */}

si nDescen. c

expresion →termino

expresionP

expresionP →+ termino expresionP

| ε

Page 17: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 17/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 17

 Análisis descendente

• En general, el método puede presentar incovenientes:– necesidad de backtracking: cuando la regla elegida no es la correcta

“devolver” a la entrada todos los tokens recorridos

» Ejemplo:

– recursividad a izda.: si alguna regla se define con recursividad a izda., elanalizador sintáctico construído entra en un bucle infinito

» Ejemplo:

• Soluciones:– factorización a izda.

– eliminación de recursividad a izda.

expr → expr + term | termino

instIF →tkIF expr tkTHEN insts

| tkIF expr tkTHEN insts tkELSE insts

Page 18: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 18/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 18

 Análisis descendente. Factorización a izda.

• Consideremos la gramática

• Si encontramos una cadena derivada de α, ¿Qué producción

aplicar?– ¿ Si sigo αC y era αB ?

– ¿ Si sigo αB y era αC ?

• Idea: retrasar la decisión, de manera que siempre se tome labuena decisión

• Ambas gramáticas generan el mismo lenguaje

A → αC | αB

A → αA’

A’ → C | B

Page 19: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 19/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 19

 Análisis descendente. Eliminación rec. izda.

• En analizadores descendentes, la recursividad a izda. da lugar abucles infinitos

• Ejemplo:

• Cuando se trata de derivar

la invocación “expr esi on( ) ” se hace recursivamente sin

consumir nuevos tokens, dando un bucle infinito

instruccion → identificador opas expr ‘;’

expr → expr ‘+’ termino

| termino

termino → identificador

| ‘(’ expr ‘)’

vel oci dad: =( vel 1+vel 2) +vel 3;

Page 20: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 20/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 20

 Análisis descendente. Recursividad a izda.

• Por suerte, la rec. directa a izda. se puede eliminar mediante unatransformación de la gramática

• Ambas gramáticas son equivalentes

A → Aα | β

A → βA’

A’ → αA’ | ε 

Page 21: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 21/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 21

 Análisis descendente. Recursividad a izda.

• Aplicando la transformación a la gramática anterior, obtenemos

• Sin embargo, sólo eliminamos la rec. izda. directa

• ¿Qué pasa con

?

instruccion → identificador opas expr ‘;’

expr →

termino expr ’

expr’ → ‘+’ termino expr ’ | ε 

termino → identificador | ‘(’ expr ‘)’

A → Bα | αB → AB | β

Page 22: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 22/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 22

 Análisis descendente. Recursividad a izda.

• El siguiente algoritmo resuelve el problema [AhSU 90] Algoritmo el i mi naRecI zda( E G: GLC; S G’ : GLC)

- - Pr e: G=( N, T, P, S) si n “ci cl os” ( A ⇒+ A) ni

- - pr oducci ones ε ( A → ε) ∧ N={A1, . . . , An}- - Post : G’ ≅ G, si n r ec. a i zda.

PrincipioG’ : =G

Para i : =1 hast a nPara  j : =1 hast a i - 1

- - A j → δ1| . . . | δk son l as- - pr oducci ones act ual es de A j

sust i t ui r en P’ A i → A jα por  A i → δ1α|...|δkα

FParael i mi nar r ec. i nmedi at a de Ai

FPara

Fin

Para tratamiento de ciclos y

 producciones ε, ver [HoUl 79]

Page 23: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 23/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 23

 Análisis descendente

enum t oken …extern enum t oken get Token( voi d) ;enum t oken t ok;void advance( ) {

t ok=get Token( ) ;}

Ejercicio 4 (1.5 ptos.): Considerar el siguiente código C quecorresponde a un analizador sintáctico descendente recursivo.Determinar, a partir del propio código, cuál es la gramática, y decirsi el analizador funcionará

correctamente.

Sep 97/98

void eat ( enum token t){if( t ok==t )

advance( ) ;else

error ( ) ;}

Page 24: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 24/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 24

 Análisis descendente. Recursividad a izda.

void S(){switch( tok){case I F: eat ( I F) ; E( ) ; eat ( THEN) ;

S( ) ; eat ( ELSE) ; S( ) ; br eak;case BEGI N: eat ( BEGI N) ; S( ) ; L( ) ; br eak;case PRI NT: eat ( PRI NT) ; E( ) ; br eak;default: e r ro r ( ) ;

}}void L ( ){

switch( tok){case END: eat ( END) ; br eak;case SEMI : eat ( SEMI ) ; S( ) ; L( ) ; br eak;

default: e r ro r ( ) ;}

}void E(){

eat ( NUM) ; eat ( EQ) ; eat ( NUM) ;}

Page 25: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 25/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 25

 Analizadores sintácticos predictivos

• Un analizador sintáctico predictivo es un analizador sintácticodescendente recursivo que NO necesita marcha atrás

• Condición exigible a una gramática para que sea posible:

– que en todo momento, a partir del siguiente token de entrada, sea posibledeterminar qué regla aplicar

• Esto es posible cuando (una de dos):

– ningún no terminal tiene alternativas en su parte derecha» gramáticas poco interesantes

– no terminales con alternativas que empiecen por distintos símbolos

• Aunque hay más casos en que también es posible

Page 26: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 26/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 26

 Analizadores sintácticos predictivos no rec.

• El hecho de que haya reglas recursivas hace que el analiziadorpredictivo implementado directamente sea recursivo

• Sin embargo, la recursividad se puede evitar mediante el uso

explícito de una pila• Un analizador predictivo sabe, a partir del símbolo que estáanalizando y el siguiente símbolo de entrada, qué regla aplicar

• Por lo tanto, se puede hacer corresponder a una tabla de dobleentrada:

(token de la forma de frase,sig. token)

(no terminal,sig. token)

Page 27: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 27/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 27

 Analizadores sintácticos predictivos no rec.

• Esta forma de implementación da lugar

• Esquema general:

anal . si nt áct i cos di r i gi dos por t abl a

Z Yk

anal i zadorsi nt áct i co

anal i zadorsi nt áct i co

t abl a deanál i si s

M[ Z, a]

. . b c b a. .

X → Z Y kS → X

pila de símbolos(a reconocer)

entrada salida

Page 28: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 28/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 28

 Analizadores sintácticos predictivos no rec.

• Esquema de funcionamiento:

 Variables p: pi l a de sí mbol os gr amat i cal es; si gTok, X: t okenPrincipio

pi l aVaci a( p) ; si gTok=yyl ex( ) ; push( p, $, S)Repetir

X=ci ma( p)Si X es t er mi nal ∨ X=$ entonces

Si X=si gTok entoncespop( p) ; si gTok=yyl ex( )

Si noer r or Si nt áct i co( )

FSiSi no

....

Hasta Que X=$Fin

Pre: M: Nx( T∪{$}) →2P: t abl a de anál . si nt .l a sec. de t okens t er mi na con $

Post: sec. de pr od. apl i cadas o er r or

Page 29: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 29/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 29

 Analizadores sintácticos predictivos no rec.

 Variables p: pi l a de sí mbol os gr amat i cal es; si gTok, X: t oken

PrincipioRepetir

. . .Si no

Si M[ X, si gTok] = X→ Y1... Yk entoncespop( p)push( p, Yk Yk-1... Y1)emi t i r pr oducci ón X→ Y1... Yk

Si noer r or Si nt áct i co( )

FSiFSi

Hasta Que X=$

Fin

Pre: M: Nx( T∪{$}) →2P: t abl a de anál . si nt .l a sec. de t okens t er mi na con $

Post: sec. de pr od. apl i cadas o er r or

l d d

Page 30: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 30/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 30

 Analizadores sintácticos predictivos no rec.

• Ejemplo: reconocer (x;(x)) para S → ( A )A → CB

B → ; A | ε

C → x | S

S→( A)A→CB A→CB

B→ ε B→; AC→S C→x

SABC

( ) ; x $

producción usada

Page 31: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 31/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 31

 Analizadoressintácticos predictivosno rec.

$

S ( x; ( x) ) $ S→( A)$) A( ( x; ( x) ) $$) A x; ( x) ) $ A→CB$) BC x; ( x) ) $ C→x$) Bx x; ( x) ) $

$) B ; ( x) ) $ B→; A$) A; ; ( x) ) $$) A ( x) ) $ A→CB$) BC ( x) ) $ C→S

$) BS ( x) ) $ S→( A)$)B)A( (x))$$) B) A x) ) $ A→CB$) B) BC x) ) $ C→x

$) B) Bx x) ) $$) B) B ) ) $ B→ε$)B) ) )$

$) B ) $ B→ε

$) )$$ $

pila entradaproducción usada

(salida)

C t ió d t bl l áli i

Page 32: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 32/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 32

Construcción de una tabla para el análisis

• Lo fundamental para la construcción de un analizador sintácticopredictivo no rec.

• Idea básica: uso de las funciones

• Objetivo: utilizar dichas funciones para construir la tabla de

análisis predictivo• Es más: una gramática es LL(1) ssi la tabla construída tiene una

única salida para cada entrada

construcción de la tabla

“primero” y “siguiente”

C t ió d t bl l áli i

Page 33: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 33/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 33

Construcción de una tabla para el análisis

• Sea G=(N,T,S,P)una gramáticaSea α una cadena de símbolos de la gramática: α ∈ (N ∪ T)*

• PRI(α): terminales que pueden comenzar una forma de frase

derivable de α

• Importante: para (empezar a) reconocer α, el siguiente token aprocesar deberá estar en PRI(α)

PRI(α)={a∈T| α ⇒* aβ} ∪

(Si α ⇒* ε

entonces {ε}si no ∅)

C t ió d t bl l áli i

Page 34: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 34/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 34

Construcción de una tabla para el análisis

• Paso 1: Calcular los conjuntos PRI(X) para cualquier símbolo gramaticalX ∈ N ∪ T

• Paso 2: Sea X1...Xn ∈ (N ∪ T)*

– Añadir a PRI(X1...Xn ) los símbolos de PRI(X1)\{ε}– Si ε ∈ PRI(X1)

añadir a PRI(X1...Xn) los símbolos de PRI(X2) \{ε}– Si

ε∈ PRI(X

1) ∩ PRI(X

2)

añadir a PRI(X1...Xn) los símbolos de PRI(X3) \{ε}– Si ε ∈ PRI(X1) ∩ PRI(X2) ∩ PRI(X3)

añadir a PRI(X1...Xn) los símbolos de PRI(X4) \{ε}

– .....– Si ε ∈ PRI(X1)∩ .... ∩ PRI(Xn)

añadir ε a PRI(X1...Xn)

Construcción de una tabla para el análisis

Page 35: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 35/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 35

Construcción de una tabla para el análisis

• Paso 1:aplicar elsiguientealgoritmo

- - Pre: X ∈ N∪ T

- - Post: cal cul a PRI ( X)

RepetirSi X∈ T

añadi r X a PRI ( X)FSi

Si X → ε  es una pr oducci ón

añadi r ε a PRI ( X)FSi

Si X → Y1. . . Yk  es una pr oducci ónSi a∈PRI ( Y j ) ∧ ε∈PRI ( Y1) ∩. . . ∩PRI ( Y j - 1)

añadi r a a PRI ( X)FSi

Si ε ∈PRI ( Y1) ∩. . . ∩PRI ( Yk)añadi r ε a PRI ( X)

FSiFSi

Hasta Que no se añada nada a ni ngún PRI

Construcción de una tabla para el análisis

Page 36: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 36/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 36

Construcción de una tabla para el análisis

• Ejemplos:

S → A B c

A → a | ε

B → b | ε

PRI ( S) ={a, b, c}

PRI ( A) ={a, ε}

PRI ( B) ={b, ε}PRI ( a) ={a}PRI ( b) ={b}PRI ( c) ={c}

PRI ( AB) ={a, b, ε}

S → a S e | B

B → b B e | C 

C → c C e | d

PRI ( S) ={a, b, c, d}PRI ( B) ={b, c, d}

PRI ( C) ={c, d}PRI ( a) ={a}PRI ( b) ={b}

. . . .

Construcción de una tabla para el análisis

Page 37: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 37/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 37

Construcción de una tabla para el análisis

• Sea G=( N, T, S, P) una gramática• Sea A un no terminal (A ∈ N)

• SIG(A) será el conjunto de todos aquellos terminales que

pueden aparecer detrás de A en alguna forma de frase

• Importante: SIG(A)=conjunto de terminales que pueden indicar(fin del) reconocimiento de una regla que tenga A en la parteizda.

SIG(A)={a∈T| S ⇒+ ...Aa...} ∪(Si S ⇒+ α A 

entonces {$}si no ∅

)

Construcción de una tabla para el análisis

Page 38: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 38/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 38

Construcción de una tabla para el análisis

• Construcción de los conjuntos SIG

--Pre: TRUE--Post: cal cul a SI G( A) par a t odo A ∈ N

añadi r $ a SI G( S)RepetirSi A → αBβ es una pr oducci ón

añadi r PRI ( β) \ {ε} a SI G( B)FSiSi A → αB es una pr oducci ón

∨ ( A → αBβ con ε∈PRI ( β) es pr oducci ón)añadi r SI G( A) a SI G( B)

FSiHasta Que no se añada nada a ni ngún SI G

Construcción de una tabla para el análisis

Page 39: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 39/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 39

Construcción de una tabla para el análisis

• Ejemplos:

S → A B c

 A → a | εB → b | ε

SI G( S) ={$}

SI G( A) ={b, c}SI G( B) ={c}

S → a S e | B B → b B e | C 

C → c C e | d 

SI G( S) ={e, $}SI G( B) ={e, $}SI G( C) ={e, $}

Construcción de una tabla para el análisis

Page 40: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 40/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 40

Construcción de una tabla para el análisis

• Construcción de la tabla:– filas indexadas por no terminales

– columnas indexadas por terminales (∪ {$})

• Ideas a seguir para la producciónA → α

– Si a∈PRI ( α) , cuando entra a se expande A por α

– Si α = ε ó α ⇒* ε» expandir A por α cuando llegue algo de SI G( A)

Construcción de una tabla para el análisis

Page 41: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 41/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 41

Construcción de una tabla para el análisis

PrincipioPara cada ( n , t ) ∈Nx( T∪{$})M[ n, t ] : = ∅ / *¿Conj unt o?*/

FPara

Para cada producción X → α

Para cada a∈PRI ( α)M[ X, a] : = M[ X, a] ∪{X → α}

FPara

FParaPara cada ( n , t ) ∈Nx( T∪{$})Si M[ n, t ] =∅ ent M[ n, t ] =ERROR FSi

FParaFin

Pre: Una gr amát i ca G=(N,T,S,P)Post: M: t abl a de anál . desc.

Si ε∈PRI ( α)  entoncesPara cada b∈ T∩SI G( X)

M[ X, b] : = M[ X, b] ∪{X → α}FPara

Si $∈SI G( X) entoncesM[ X, $] : = M[ X, $] ∪{X → α}FSi

FSi

Construcción de una tabla para el análisis

Page 42: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 42/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 42

Construcción de una tabla para el análisis

• Aternativamente, G es LL(1) ssi para toda producción– α y β no pueden derivar cadenas que comiencen por un mismo terminal

a

– ¬( (α ⇒* ε ) ∧ (β ⇒* ε ) )

– Si β ⇒* ε , α no deriva ninguna cadena que comience con un elemento de T∩SI G( A)

Una gramática es LL(1) cuando en latabla construída según el métodoanterior cada elemento es una de las dos cosassiguientes:

*ERROR *un conjunto con una única producción

gramática LL(1)

A → α| β

Construcción de una tabla para el análisis

Page 43: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 43/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 43

p

• Notar las ventajas de LL(1):– por cada token de entrada, sabemos exactamente qué producción se debe

aplicar

– no hay backtracking

– asegura un anal. descendente correcto

– no son ambíguas

– complejidad de los anal. LL(1) :

» lineal en tiempo

» lineal en espacio

• ¿Si la gramática no es LL(1)?

– intentar transformarla en LL(1)

– no siempre es posible

– aunque aparecen con mucha

frecuencia

f unci ón de l ong.de l a cadena de t okens

• También existengramáticas LL(k) queemplean unageneralización de las

técnicas presentadas

Sobre recuperación/reparación de errores

Page 44: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 44/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 44

p / p

• ¿Cuál es el objetivo de la recuperación de errores?– no abortar la compilación

– informar de las decisiones tomadas

• Situación de error:

• ¿Cómo recuperarse de la situación?– recuperación: eliminar símbolos de la entrada o de la pila hasta llegar a

un estado que pueda seguir

– reparación: “reparar“ la entrada del usuario

... b ... A ...$

 pila

entrada

T(A,b)=error 

Sobre recuperación/reparación de errores

Page 45: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 45/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 45

p p

• Recuperación– modo pánico: eliminar símbolos de la entrada hasta encontrar alguno

específico del conjunto de sincronización

• Reparación:– supongamos una entrada en el estado αtβ, donde α es lo ya analizado y

t el siguiente token

– tres actuaciones posibles:

» modificar α

» insertar un δ esperando que αδtβ sea del lenguaje

» eliminar t esperando que sea αβ del lenguaje

Sobre recuperación/reparación de errores

Page 46: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 46/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 46

p p

insts → insts ‘;’ inst

insts → inst

inst → instMQ | instAS | ...

instAS → tkID tkOPAS exp 

instMQ → tkMQ exp insts

...

...

x := 27z ;

y := 29 ;...

• al encontrar “z” podemos tratar de arreglarlo como:

– Se esperaba “;”

– por lo que lo “insertamos”. Sin embargo ....

– Se esperaba “;”– por lo que seguimos hasta encontrarlo. Sin embargo ....

Sobre recuperación/reparación de errores

Page 47: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 47/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 47

p p

• No hay un método universal, por lo que se aplican ciertas reglasheurísticas

• Para cada no terminal, definamos sinc(A)

• Veamos algunos elementos a añadir en sinc(A)– añadir SIG(A) a sinc(A)

– usar la jerarquía del lenguaje

» añadir el conjunto de sinc deun nivel a los inferiores

 bloque↓

instrucción↓

expresión↓

término↓

factor....

Sobre recuperación/reparación de errores

Page 48: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 48/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 48

• Ejemplo:

insts → inst insts’

insts’ → inst insts’ | ε 

inst → instMQ | instAS | ...

instAS → tkID tkOPAS exp ‘;’

instMQ → tkMQ ‘(‘ exp ‘)’ insts

...

x = 3 While (x > y) {

....

}

Sobre recuperación/reparación de errores

Page 49: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 49/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 49

– para A ∈ N, añadir PRI(A) a sinc(A)

» Seguir análisis por A cuando llegue uno de ellos

– si A ⇒* ε, cima(p)=A ,

» disparar A ⇒* ε– si cima(p)=x y x<>sigToken (x es terminal)

» eliminar x de la pila

» dar mensaje “x ha sido insertado ”

Es una inserción“virtual”

Sobre recuperación/reparación de errores

Page 50: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 50/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 50

 procedure pr uebaEr r or es1 i sx: integer;y: integer : = 1;

 beginx : = 3while x>y loop

x : = x- 1;end loop;x : = ;

end ;

5: 15: mi ssi ng " ; "9: 13: mi ssi ng oper and

int mai n( ) {int x,

y = 1;

x = 3while( x>y)

x = x- 1;x = ;

}

gnatmake

gcc 

6: par se er r or bef or e `whi l e'

8: par se er r or bef or e `; '

Sobre recuperación/reparación de errores

Page 51: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 51/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 51

 procedure pr uebaEr r or es2 i sx: integer;y: integer : = 1;

 beginx : = 3 z;while x>y loop

x : = x- 1;end loop;x : = ;

end ;

10: 10: bi nar y oper at or expect ed14: 08: mi ssi ng oper and

int mai n( ) {int x,

y = 1;

x = 3 z;while( x>y)

x = x- 1;x = ;

}

gnatmake

gcc 

5: par se er r or bef or e `z`

8: par se er r or bef or e `; `

Sobre recuperación/reparación de errores

Page 52: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 52/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 52

l i ne 6: er r or 1000: Unexpect ed symbol : "whi l e" .l i ne 7: er r or 1000: Unexpect ed symbol : "x" .l i ne 8: er r or 1000: Unexpect ed symbol : " ; " .l i ne 5: er r or 1533: I l l egal f unct i on cal l .l i ne 5: war ni ng 714.l i ne 5: er r or 1549: Modi f i abl e l val ue r equi r ed f or assi gnment oper at or .l i ne 1: war ni ng 517: Funct i on r et ur ns no val ue.l i ne 1: war ni ng 845: er r or s seen ski ppi ng t he code i ncl udi ng f unct i on.

int mai n( ) {int x,

y = 1;

x = 3while( x>y)x = x- 1;

x = ;}

lint

Sobre recuperación/reparación de errores

Page 53: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 53/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 53

NAMEl i nt - a C pr ogr am checker / ver i f i er

SYNOPSI Sl i nt [ opt i ons] f i l e . . .

DESCRI PTI ONl i nt at t empt s t o det ect f eat ur es i n C pr ogr am f i l es t hat ar e l i kel y t obe bugs, non- por t abl e, or wast ef ul . I t al so checks t ype usage mor est r i ct l y t han t he compi l er s. Pr ogr am anomal i es cur r ent l y det ect edi ncl ude unr eachabl e st at ement s, l oops not ent er ed at t he t op,

aut omat i c var i abl es decl ar ed but not used, and l ogi cal expr essi onswhose val ue i s const ant . Usage of f unct i ons i s checked t o f i ndf unct i ons t hat r et ur n val ues i n some pl aces and not i n ot her s,f unct i ons cal l ed wi t h var yi ng number s or t ypes of ar gument s, andf unct i ons whose val ues ar e not used or whose val ues ar e used but none

r et ur ned.

 Ejercicios

Page 54: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 54/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 54

•Ejercicio 1: Considérese la siguiente gramática:S → [ S

| S1

S1→ [ a]

•1.1) (1 pto.) Establecer el lenguaje que genera. Es necesario que se justifique, lomás formalmente posible, la respuesta

•1.2) .....•1.3) (1 pto.) ¿Se trata de una gramática LL(1)?

•1.4) (0.5 ptos.) Si no es SLR(1), dar una gramática equivalente que sí lo sea.Análogamente, si no es LL(1) dar una gramática equivalente que sí lo sea..

Jun. 96

 Ejercicios

Page 55: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 55/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 55

Ejercicio 2 (5 ptos. ) : Considérese la siguientegramática (en negrita los terminales):

S → ( L )

S → aL → L , S

L → S

2.1 (0.5 ptos.) ¿Qué lenguaje genera?

2.2 .....

2.3 (2 ptos.) Evidentemente, se trata de una gramática no LL(1). Transformarlaen una equivalente que sí lo sea, y contruir la tabla del análisis sintáctico LL(1)

Feb. 96

 EjerciciosSep. 98

Page 56: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 56/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 56

Ejercicio 3 (5.5 ptos. Sep. 98): Considérese la siguientegramática:

G:

S → uBDz

B → BvB → wD → EFE → y

E → εF → xF → ε

1) Construir las tablas del análisis sintáctico SLR, y determinar si se trata de

una gramática SLR o no2) Comprobar que se trata de una gramática no LL(1). Transformarla en una

gramática LL(1), y calcular su tabla de análisis LL(1)

 Ejercicios

Page 57: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 57/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 57

Ejercicio 3 (3.0 ptos.): Considerar la siguiente gramática(en negrita los terminales):

S → P MP → E

| q M → n EE → , O

| E

O → u| u,O

Probar que se trata de una gramática NO LL(1). Si es posible, realizar lastransformaciones precisas para convertirla en LL(1) y, construyendo la tabla

del análisis LL(1), demostrar que la gramática transformada es efectivamentede esta clase. Es necesario justificar las transformaciones que se realicen. Sino fuera posible transformarla en LL(1), explicar la razón

Feb. 98

 Ejercicios

Page 58: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 58/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 58

• Ejercicio 2 (1.5 ptos.): Dada una secuencia ω determinales elalgoritmo de análisis LL(1) emite la secuencia de produccionesaplicadas para su derivación, o error si no es capaz de encontrarla.Vamos a denotar n el número de no terminales de la gramática, y |ω|

la longitud de la secuencia de entrada. Se sabe que, en el caso de queel algoritmo dé respuesta afirmativa, el coste de ejecución delalgoritmo es Ω(|ω|), Ο(n|ω|). En el cálculo de este coste se hanconsiderado como operaciones de coste constante las siguientes:

– obtener la cima de la pila

– apilar y desapilar símbolos gramaticales

– obtener el siguiente terminal de la sencuencia de entrada

– consultar el valor en la tabla correspondiente a un par (no terminal,terminal)

– emitir una producción

 Ejercicios

Page 59: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 59/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 59

• Consideremos ahora la siguiente gramática:– X1 - - > X2 X2 X2

– X2 - - > a2 | X3

– X3 - - > a3 | X4– X4 - - > a4 | X5

– . . . .

– Xn- 1 - - > an- 1 | Xn

– Xn - - > an

• El ejercicio pide escribir dos frases del lenguaje generado por lagramática anterior, w1 y w2, tal que los costes de ejecución del algoritmo

de reconocimiento sean, respectivamente, del orden de |w1| y n|w2|.• ¿Cuál puede ser el coste del algoritmo, en el mejor y el peor caso,

cuando se aplica a una frase que no es reconocida por el análisis LL(1)?

• Nota: en todos los casos la respuesta debe ser razonada.

Sintaxis expresiones en Pascal

Page 60: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 60/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 60

variable

identificador 

de campo

expresión[ ]

identif . de campo

,

identif.de variable

.

^

expresiónsimple

expresión

simple

= < > <= >= <> IN

expresión

Sintaxis expresiones en Pascal

Page 61: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 61/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 61

factor 

* / div mod and

término

factor 

término

+ - OR

expresiónsimple

término

+

-

Sintaxis expresiones en Pascal

f

Page 62: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 62/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 62

cons tante sin signo

variable

factor 

identificador 

de funciónexpresión( )

expresión( )

factor NOT

[ ]expresión expresión..

,

,

Sintaxis expresiones en Pascal

Page 63: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 63/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 63

identificador de constante

caracter 

numero sin signo

' '

constantesin signo

NIL

Sintaxis expresiones en Pascal

Page 64: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 64/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 64

expr:expSi mpl e

| expr opRel expSi mpl e

expSimple:term| expSi mpl e opSum t er m

opRel:' ='| ' <'| ' >'

| MEI| MAI| NI

opSum :' +'

| ' - '| OR

term :f act or

| ' +' t er m| ' - ' t er m %pr ec ' - '| t er m opMul f act or

opMul:' *'

| ' / '| DI V| MOD| AND

Sintaxis expresiones en Pascal

Page 65: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 65/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 65

factor:const ant e

| I DENTI FI CADOR| I DENTI FI CADOR ' [ ' expr ' ] '

| I DENTI FI CADOR ' ( ' l i st aAct ual es ' ) '| ' ( ' expr ' ) '| NOT f act or %pr ec NOT

constante:CONSTENTERA

| CONSTBOOLEANA| CONSTCADENA

| CONSTCARACTER

Sintaxis expresiones en Ada[ . . . ] : 0 ó 1{. . . }: 0 ó más

Page 66: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 66/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 66

ex pression ::=

relation {and relation}| relation {and then relation}| relation {or relation}| relation {or else relation}| relation {xor relation}

relation ::=simple_expression [relational_operator simple_expression]

| simple_expression [not] in range| simple_expression [not] in subtype_mark

sim  ple_expression ::=[unary_adding_operator] term { binary_adding_operator term }

term ::=factor { multiplying_operator factor}

factor ::= primary [** primary]| abs primary| not primary

Sintaxis expresiones en Ada[ . . . ] : 0 ó 1{. . . }: 0 ó más

Page 67: no_4.asll1

7/15/2019 no_4.asll1

http://slidepdf.com/reader/full/no4asll1 67/67

Compiladores I. C.P.S. Universidad de Zaragoza -J.Ezpeleta- 67

 primary ::=numeric_literal

| null| string_literal| aggregate| name

| qualified_expression| allocator| (expression)

logical_operator ::= and | or | xor

relational_operator ::= = | /= | < | <= | > | >=

 binary_adding_operator ::= + | - | &

unary_adding_operator ::= + | - 

 multiplying_operator ::= * | / | mod | rem 

highest_precedence_operator ::= ** | abs | not