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

  1. 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 ...
  2. La precedencia de una regla de producción AαA \rightarrow \alpha es la precedencia del último token que aparece en la parte derecha α\alpha de la regla.
    • Por ejemplo la precedencia de ee@ee \rightarrow e @ e será la precedencia que le demos al token @@ en la cabecera del programa Jison.
  3. 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:
    exp: '-' exp %prec 'STRONG'
    asigna la precedencia del token STRONG a la regla exp: '-' exp
  4. 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 AαA \rightarrow \alpha y otra que indica que quizá se pueda seguir leyendo el token tt a la entrada,
    1. El parser compara las precedencias del token y de la regla y se queda con el de mas prioridad.
    2. Si es el token quien tiene mayor prioridad avanzará en la lectura desplazando el token tt y buscando nuevos símbolos (se dice que hace un shift; en este caso el AST se "hundirá" a derechas) y
    3. Si es la regla completará el subárbol parcial αA\overset{A}{\overset{\triangle}{\alpha}} 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)
  5. Los tokens declarados en la misma línea mediante una declaración %left o %right tienen igual precedencia e igual asociatividad.
  6. La precedencia es mayor cuanto mas abajo su posición en el texto

Jison

Introducción al Análisis LR

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

Historia

GLR: Generalized LR