regular positive not negative look literal expressions exist example does around parsing context-free-grammar lookahead dfa lr

parsing - positive - LR(1) Artículo DFA-Lookaheads de computación



regex positive lookahead example (4)

Tengo problemas para entender cómo calcular los lookaheads para los elementos LR (1).

Digamos que tengo esta gramática:

S -> AB A -> aAb | a B -> d

Un elemento LR (1) es un elemento LR (0) con un lookahead. Entonces obtendremos el siguiente elemento LR (0) para el estado 0:

S -> .AB , {lookahead} A -> .aAb, {lookahead} A -> .a, {lookahead}

Estado: 1

A -> a.Ab, {lookahead} A -> a. ,{lookahead} A -> .aAb ,{lookahead} A ->.a ,{lookahead}

¿Alguien puede explicar cómo calcular los lookaheads? ¿Cuál es el enfoque general?

Gracias de antemano


El conjunto de elementos LR (1) construido por usted debe tener dos elementos más.

I8 A -> aA.b, b desde I2

I9 A -> aAb. , b de I8


aquí está el autómata LR (1) para la gramática, ya que el seguimiento se ha realizado anteriormente. Creo que es mejor para la comprensión intentar dibujar el autómata y el flujo hará que la idea de las miras más claras


Los lookaheads utilizados en un analizador LR (1) se calculan de la siguiente manera. Primero, el estado de inicio tiene un elemento de la forma

S -> .w ($)

para cada producción S -> w, donde S es el símbolo de inicio. Aquí, el marcador $ denota el final de la entrada.

A continuación, para cualquier estado que contenga un elemento de la forma A -> x.By (t), donde x es una cadena arbitraria de terminales y no terminales, y B es un no terminal, se agrega un elemento de la forma B -> .w (s) para cada producción B -> wy para cada terminal en el conjunto FIRST (yt). (Aquí, PRIMERO se refiere a los PRIMEROS conjuntos , que generalmente se presentan al hablar sobre los analizadores de LL. Si no los ha visto antes, me tomaría unos minutos revisar esas notas de clase).

Probemos esto en tu gramática. Comenzamos creando un conjunto de elementos que contiene

S -> .AB ($)

Luego, usando nuestra segunda regla, para cada producción de A, agregamos un nuevo ítem correspondiente a esa producción y con lookaheads de cada terminal en FIRST (B $). Como B siempre produce la cadena d, FIRST (B $) = d, entonces todas las producciones que presentamos tendrán lookahead d. Esto da

S -> .AB ($) A -> .aAb (d) A -> .a (d)

Ahora, construyamos el estado correspondiente a ver una ''a'' en este estado inicial. Comenzamos moviendo el punto más de un paso para cada producción que comienza con un:

A -> a.Ab (d) A -> a. (d)

Ahora, dado que el primer elemento tiene un punto antes de un no terminal, usamos nuestra regla para agregar un ítem por cada producción de A, lo que permite que esos ítems se vean primero FIRST (bd) = b. Esto da

A -> a.Ab (d) A -> a. (d) A -> .aAb (b) A -> .a (b)

Continuando con este proceso, finalmente se construirán todos los estados LR (1) para este analizador LR (1). Esto se muestra aquí:

[0] S -> .AB ($) A -> .aAb (d) A -> .a (d) [1] A -> a.Ab (d) A -> a. (d) A -> .aAb (b) A -> .a (b) [2] A -> a.Ab (b) A -> a. (b) A -> .aAb (b) A -> .a (b) [3] A -> aA.b (d) [4] A -> aAb. (d) [5] S -> A.B ($) B -> .d ($) [6] B -> d. ($) [7] S -> AB. ($) [8] A -> aA.b (b) [9] A -> aAb. (b)

En caso de que ayude, impartí un curso de compiladores el verano pasado y tengo todas las diapositivas de conferencias disponibles en línea . Las diapositivas en el análisis de abajo arriba deben abarcar todos los detalles del análisis de LR y la construcción de la tabla de análisis sintáctico, y espero que los encuentren útiles.

¡Espero que esto ayude!


También recibo 11 estados, no 8:

State 0 S: .A B ["$"] A: .a A b ["d"] A: .a ["d"] Transitions S -> 1 A -> 2 a -> 5 Reductions none State 1 S_Prime: S .$ ["$"] Transitions none Reductions none State 2 S: A .B ["$"] B: .d ["$"] Transitions B -> 3 d -> 4 Reductions none State 3 S: A B .["$"] Transitions none Reductions $ => S: A B . State 4 B: d .["$"] Transitions none Reductions $ => B: d . State 5 A: a .A b ["d"] A: .a A b ["b"] A: .a ["b"] A: a .["d"] Transitions A -> 6 a -> 8 Reductions d => A: a . State 6 A: a A .b ["d"] Transitions b -> 7 Reductions none State 7 A: a A b .["d"] Transitions none Reductions d => A: a A b . State 8 A: a .A b ["b"] A: .a A b ["b"] A: .a ["b"] A: a .["b"] Transitions A -> 9 a -> 8 Reductions b => A: a . State 9 A: a A .b ["b"] Transitions b -> 10 Reductions none State 10 A: a A b .["b"] Transitions none Reductions b => A: a A b .