Nov 12, Lunes 2018... · 2020-03-04 · Especificación de Sintaxis y Semán?ca en Estándares de...

Post on 30-Mar-2020

1 views 0 download

Transcript of Nov 12, Lunes 2018... · 2020-03-04 · Especificación de Sintaxis y Semán?ca en Estándares de...

Nov12,Lunes

Agendaparaestaclase�  JerraquíadeChomsky�  Sintaxis,RestriccionesSemánticas,ySemántica�  ÁrboldeSintaxisConcreta&ÁrboldeSintaxisAbstracta�  AmbigüedadesSintácticas�  SintaxisdeC–UnidaddeTraducción�  SintaxisdeC–Sentencias�  IntregraciónLex/Yacc�  ResolucióndelÚltimoFinal

Prof. Esp. Ing. José María Sola 395

Prof. Esp. Ing. José María Sola 396

JerarquíadeChomskyLenguaje Gramática Autómat

aOtros Aplicación

Regular GR AF ERàRegExàLex

AnálisisLéxico

IndependientedelContexto

GIC APD BNFàEBNFàYacc

AnálisisSintáctico

SensiblealContexto

GSC MT(Autómatalinearmenteacotado)

- -

Irrestrictico GI MT - -

Prof. Esp. Ing. José María Sola 397

EspecificacióndeSintaxisySemánticaenEstándaresdeLenguajesdeProgramación

EspecificacióndeSintaxisySemán?caenEstándaresdeLenguajesdeProgramación1.   Sintaxis

�  ReglasSintácticas�  Espeficiacióndelconstructosintácticoennotaciónbasadaen

GIC,porejemplo,K&RyBNF2.   Restriccionesparaquetengasemántica

�  Reglassemánticas�  Restriccionessemánticassensiblesalcontextoparaqueel

constructosintácticotengansemántica,expresadasenlenguajenatural,conreferenciaaloselementossintácticosdelconstructo

3.   Semántica�  Definicióndelcomportamientoobservable,expresadoen

lenguajenatural

Prof. Esp. Ing. José María Sola 399

EjemplodeSintaxisySemán?ca:SentenciadeSelección

Prof. Esp. Ing. José María Sola 400

EjemplodeSintaxisySemán?ca:SentenciaIf

�  Sintaxisconcreta�  ArbóldeSintaxisConcreto

�  EspecíficaparaunLP�  Conreta�  Contokens�  Forma�  Produectodeladerivaciónsegúnreglassintáticas

�  Sintaxisabstracta�  ÁrboldeSintaxisAbstracto

�  GeneralparavariosLP�  Conceptual�  Sintokens�  Semátinca� Necesariaparaelanálisissemántico

SintaxisConcretayAbstracta

if ( a ) f();

if ( b ); g(); else h();

� ASC:� ASA:

� ASC:� ASA:

Ejercicio:ObtenerlosÁrbolesdeSintaxisConcretayAbstracta

if ( a ) if( b ) g(); else h();

if ( a ) if( b ) g(); else h();

Ejercicio:DibujecadaÁrboldeDerivaciónSintác?ca

if ( a ) { if( b ){ g(); } } else { h(); }

if ( a ) { if( b ) g(); } else h();

if ( a ) { if( b ){ g(); } else { h(); } }

if ( a ) { if( b ) g(); else h(); }

¿Conclusión?� Dosderivacionesposibles� Dossemánticasposibles� Ambigüedad:

� Unasintaxisesambiguacuandopermitemásdeunárboldederivación

�  ¿Quépasaenotroslenguajes?�  ¿Soluciones?

�  Estilo�  Llavessiempre�  Llavescuandoselasrequiere

�  CorreccióndelaS&Sdelasentenciaif

Ejemplo:ResolucióndelaÚnicaAmbigüedadenC

Prof. Esp. Ing. José María Sola 408

AxiomadeunProgramaC

ReglasdeSintaxisparaCualquierProgramaC�  ¿Quéesun“programa”?�  ¿Quéincluir?�  ¿Dóndecomenzar?�  ¿Cúaleslaformageneral?

Prof. Esp. Ing. José María Sola 411

unidad-de-traducción declaración-externa unidad-de-traducción declaración-externa

declaración-externa

definición-de-función declaración

definición-de-función

especificadores-de-declaración? declarador sentencia-compuesta

Unidaddetraducciónydefinicióndefunción

sentencia: sentencia-expresión sentencia-compuesta sentencia-de-selección sentencia-de-iteración sentencia-etiquetada sentencia-de-salto

sentencia-expresión:

expresión? ;

Sentencia

sentencia-compuesta: { lista-de-declaraciones? lista-de-sentencias? }

lista-de-declaraciones:

declaración lista-de-declaraciones declaración

lista-de-sentencias:

sentencia lista-de-sentencias sentencia

Sentenciacompuesta(¿C11?)

sentencia-de-selección: if ( expresión ) sentencia if ( expresión ) sentencia else sentencia switch ( expresión ) sentencia

Sentenciadeselección

sentencia-de-iteración: while ( expresión ) sentencia do sentencia while ( expresión ) ; for ( expresión? ; expresión? ; expresión? ) sentencia

Sentenciadeiteración(¿C11?)

sentencia-etiquetada: case expresión-constante : sentencia default : sentencia identificador : sentencia sentencia-de-salto: continue ; break ; return expresión? ; goto identificador ;

Sentenciae?quetadaydesalto

Prof. Esp. Ing. José María Sola 419

Prof. Esp. Ing. José María Sola 420

Lex&Yacc:%token&y.tab.h� %tokenindicalosterminalesotokensdelagramática� Elheadery.tab.hlogenerayacccuandoseindicalaopción–ddesdelalíneadecomando,ycontienelasdeclaracionesdetokens

� Elheaderlodebeincluirelprogramaresultantedelex

Prof. Esp. Ing. José María Sola 421

�  Scanner.l

�  Lex�  Scanner.c

�  CC�  Scanner.obj

�  Parser.y

�  Yacc�  Parser.tab.c�  Parser.tab.h

�  CC�  Parser.tab.obj

�  Prog.c

�  CC�  Prog.obj+�  Parser.tab.obj�  Scanner.obj

�  Link�  Prog.exe

�  Funciones�  yyacc()�  yylex()

GeneracióndeProgramadesdeespeificacionesLexyYacc

Prof. Esp. Ing. José María Sola 422

�  Ejercicios:�  DefinaformlemantelaGIC�  ¿HayAF?�  DefinaformalmenteelAPD

�  Escribirunprogramaqueinformeelvalorycuántosparéntesislorodean:�  Makefile�  main.c�  Yacc.y�  Scanner.l

LenguajeEjemplo

Prof. Esp. Ing. José María Sola 423

ExtractodeEspecificaciónLex%% [ \t\n] ; [0-9]+ {yylval = atoi(yytext);return NUMBER;} "(" {yylval = *yytext; return LPAR;} ")" {yylval = *yytext; return RPAR;} . {printf("Lex error.\n");exit(EXIT_FAILURE);} %%

Prof. Esp. Ing. José María Sola 424

ExtractodeEspecificaciónYacc%% S : NUMBER {n=$1;} | LPAR S RPAR {++ns;} ; %%

Prof. Esp. Ing. José María Sola 425

ProgramaCompleto–MakefileCFLAGS = -std=c11 -Weverything YACC = bison RM = rm -f .PHONY: clean all

all: prog prog: main.o Parser.tab.o Scanner.o $(CC) -o $@ $^ $(RM) main.o Parser.tab.h Parser.tab.o Scanner.o Scanner.c

%.tab.c %.tab.h: %.y $(YACC) -d $<

Scanner.c : Parser.tab.h clean: $(RM) prog main.o Parser.tab.h Parser.tab.o Scanner.o Scanner.c

Prof. Esp. Ing. José María Sola 426

ProgramaCompleto–main.c#include <stdio.h> int main(void){ int yyparse(void); switch(yyparse()){ case 0:{ extern unsigned ns; extern int n; printf("Se encontró %d rodeado de %d paréntesis.\n",n,ns); return 0; } case 1: printf("Error sintático.\n"); return 1; default: printf("Otro error.\n"); return 2; }

}

Prof. Esp. Ing. José María Sola 427

ProgramaCompleto–Parser.y%{ #include <stdio.h> unsigned ns; int n; int yyerror(const char *); %} %token NUMBER LPAR RPAR %% S : NUMBER {n=$1;} | LPAR S RPAR {++ns;} ; %% int yyerror(const char *s){}

Prof. Esp. Ing. José María Sola 428

ProgramaCompleto–Scanner.l%option noyywrap %{ #include <stdlib.h> #include "Parser.tab.h" %} %% [ \t\n] ; [0-9]+ {yylval = atoi(yytext);return NUMBER;} "(" {yylval = *yytext; return LPAR;} ")" {yylval = *yytext; return RPAR;} . {printf("Lex error.\n");exit(EXIT_FAILURE);} %%

Prof. Esp. Ing. José María Sola 429

PrácticayAutodiagnósticohttps://josemariasola.wordpress.com/ssl/exams/

Prof. Esp. Ing. José María Sola 430