Análisis Sintáctico LR
Breaking Ambiguity in Jison/Eyapp/Yacc/Bison et al. using token precedence
These is a simplified version of the rules to resolve conflicts and ambiguities in a Yacc-like parser generator:
Precedence Rules
- La precedencia de los tokens se hace en la cabecera del programa Jison; esto es: antes del primer
%%
usando la sintáxis%left token ...
,%right token ...
o%nonassoc token ...
- La precedencia de una regla de producción es la precedencia del último token que aparece en la parte derecha de la regla.
- Por ejemplo la precedencia de será la precedencia que le demos al token en la cabecera del programa Jison.
- Si no existen tokens en la parte derecha con precedencia asignada o bien si la precedencia por defecto no es la deseada, se puede usar la directiva
%prec
para asignar la precedencia deseada a la regla. Por ejemplo:asigna la precedencia del tokenexp: '-' exp %prec 'STRONG'
STRONG
a la reglaexp: '-' exp
- Cuando el parser detecta un conflicto y ve que hay dos posibles vias de continuar la construcción del árbol: Una que indica que quizá se aplicó la regla y otra que indica que quizá se pueda seguir leyendo el token a la entrada,
- El parser compara las precedencias del token y de la regla y se queda con el de mas prioridad.
- Si es el token quien tiene mayor prioridad avanzará en la lectura desplazando el token y buscando nuevos símbolos (se dice que hace un shift; en este caso el AST se "hundirá" a derechas) y
- Si es la regla completará el subárbol parcial y continuará en su construcción del árbol (se dice que hace un reduce y en este caso el árbol construido estará más hundido a izquierdas)
- Los tokens declarados en la misma línea mediante una declaración
%left
o%right
tienen igual precedencia e igual asociatividad. - La precedencia es mayor cuanto mas abajo su posición en el texto
Jison
- Jison Documentation (opens in a new tab)
- Jison Debugger (opens in a new tab) ¡No te lo pierdas!
- Mi primer proyecto utilizando Jison (opens in a new tab) por Erick Navarro
- Repo ULL-ESIT-PL-1718/jison-aSb (opens in a new tab)
- Repo ULL-ESIT-PL-1718/ull-etsii-grado-pl-jisoncalc (opens in a new tab)
- Folder jison/examples from the Jison distribution (opens in a new tab)
Introducción al Análisis LR
- Análisis Sintáctico Ascendente en JavaScript (opens in a new tab)
- Precedencia y Asociatividad (opens in a new tab)
- Construcción de las Tablas para el Análisis SLR (opens in a new tab)
- Algoritmo de Análisis LR (yacc/bison/jison) (opens in a new tab)
- Learning to Manage Conflicts
- Conflicto ds ;ss (opens in a new tab)
- Parse::Eyapp Debugging Tutorial (opens in a new tab)
- Lexical Tie ins: a flag which is set by the parser actions, whose purpose is to alter the way tokens are parsed
Parse::Eyapp
Parse::Eyapp is an extension of yacc for Perl, the standard Unix compiler-compiler. It provides a compiler which lets you compile yacc -like grammars into a Perl LALR(1) Object Oriented parser. It automates the building of the abstract syntax trees, provides an API for tree transformation and has being used inside the Perl community in many projects (see for instance the RPerl compiler developed by AutoParallel Technologies at http://rperl.org/ (opens in a new tab)).
Casiano Rodriguez-Leon created the compiler and maintained during the years 2006 to 2017. From 2017 up to now is maintained by William N. Braswell, Jr.
See https://metacpan.org/dist/Parse-Eyapp/view/eyapp (opens in a new tab), https://cpan.metacpan.org/authors/id/C/CA/CASIANO/ (opens in a new tab), https://metacpan.org/author/CASIANO/releases (opens in a new tab)
LR Parses for C languages
- ANSI C y C++ Grammars
- Old examples of tiny C languages in Eyapp. PL de la Antigua Ingeniería Informática (opens in a new tab). Eyapp is/was a LALR parser generator written by Casiano. The repo contains a compiler for a subset of C.
Historia
- Parsing: a timeline. by Jeffrey Kegler (opens in a new tab)
- Parse-Eyapp (opens in a new tab) un Parser LR para Perl