Pregunta

Tengo una sintaxis como

%(var)

y

%var

y     (Var)

Mis reglas son algo así como

optExpr:
    | '%''('CommaLoop')'
    | '%' CommaLoop

CommaLoop:
    val | CommaLoop',' val

Expr:
    MoreRules
    | '(' val ')'

El problema es que doesnt parece ser capaz de decir si) pertenece a %(CommaLoop) o % (val) pero se queja sobre el) en lugar de la (. ¿Qué diablos? Shouldnt se quejan de (? Y ¿cómo debo corregir el error? Creo que hacer %( un token es una buena solución, pero quiero estar seguro de qué $( tampoco un error antes de hacer esto.

¿Fue útil?

Solución

Esto es debido a los trabajos de análisis sintáctico LR manera. Análisis sintáctico LR es efectivamente de abajo hacia arriba, la agrupación de fichas de acuerdo a la RHS de sus reglas de la gramática, y reemplazándolos con la LHS. Cuando el analizador 'cambia', que pone una ficha en la pila, pero en realidad no coincide con una regla todavía. En su lugar, hace un seguimiento de emparejado parcialmente reglas a través del estado actual. Cuando se llega a un estado que corresponde al final de la regla, se puede reducir, apareciendo los símbolos para el lado derecho de la pila y haciendo retroceder un solo símbolo que denota el LHS. Así que si hay conflictos, que no aparecen hasta que el analizador llega al final de alguna regla y no puede decidir si reduce (o lo que para reducir).

En su ejemplo, después de ver % ( val , que es lo que va a estar en la pila ( es superior a la derecha aquí) Cuando la búsqueda hacia delante es ) , no se puede decidir si se debe hacer estallar la val y reducir a través de la regla CommaLoop:. val o si se debe cambiar el ) a continuación, por lo que puede hacer estallar 3 cosas y reducir con la regla Expr: '(' val ')'

Estoy asumiendo aquí que usted tiene algunas reglas adicionales, tales como CommaLoop:. Expr , de lo contrario su gramática no representa realmente a nada y bisontes / yacc se quejan de no terminales no utilizados

Otros consejos

En este momento, no parece que su explicación y su gramática para que coincida. En su explicación, que muestran las tres frases que tienen 'var', pero su gramática muestra los que empiezan con '%' como permitir una lista separada por comas, mientras que el uno sin permite sólo un único 'val'.

Por el momento, voy a suponer que los tres deben permitir una lista separada por comas. En este caso, me gustaría factor de la gramática de la misma familia:

optExpr: '%' aList

aList: CommaLoop
    | parenList

parenList: '(' CommaLoop ')'

CommaLoop: 
    | val 
    | CommaLoop ',' val

Expr: MoreRules
    | parenList

He cambiado optExpr y Expr por lo que tampoco se puede hacer coincidir una secuencia vacía - mi conjetura es que probablemente no tiene la intención de que, para empezar. He pulpa esto suficiente para ejecutarlo a través de byacc; que no produce advertencias o errores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top