Estoy construyendo un analizador sintáctico para un lenguaje de programación imaginario llamado C-- (no el lenguaje C-- real). Llegué al punto en el que necesito traducir la gramática del idioma a algo que Pyparsing puede aceptar. Desafortunadamente, cuando procedo a analizar mi cadena de entrada (que es correcta y no debe causar errores de Pyrarsing), no está analizando correctamente. Me temo que esto se debe a errores en mi gramática, pero como estoy empezando a Pyparsing por primera vez, parece que no puedo ver dónde me estoy equivocando.Depurando Pyparsing Grammar
He subido la gramática que estoy traduciendo de here para que las personas la lean.
EDIT: Actualizado con el asesoramiento de Paul.
Ésta es la gramática Tengo actualmente (las dos líneas superiores de Sintaxis definición son terriblemente mal de mí lo sé):
# Lexical structure definition
ifS = Keyword('if')
elseS = Keyword('else')
whileS = Keyword('while')
returnS = Keyword('return')
intVar = Keyword('int')
voidKeyword = Keyword('void')
sumdiff = Literal('+') | Literal('-')
prodquot = Literal('*') | Literal('/')
relation = Literal('<=') | Literal('<') | Literal('==') | \
Literal('!=') | Literal('>') | Literal('=>')
lbrace = Literal('{')
rbrace = Literal('}')
lparn = Literal('(')
rparn = Literal(')')
semi = Literal(';')
comma = Literal(',')
number = Word(nums)
identifier = Word(alphas, alphanums)
# Syntax definition
term = ''
statement = ''
variable = intVar + identifier + semi
locals = ZeroOrMore(variable)
expr = term | OneOrMore(Group(sumdiff + term))
args = ZeroOrMore(OneOrMore(Group(expr + comma)) | expr)
funccall = Group(identifier + lparn + args + rparn)
factor = Group(lparn + expr + rparn) | identifier | funccall | number
term = factor | OneOrMore(prodquot + factor)
cond = Group(lparn + expr + relation + expr + rparn)
returnState = Group(returnS + semi) | Combine(returnS + expr + semi)
assignment = Group(identifier + '=' + expr + semi)
proccall = Group(identifier + lparn + args + rparn + semi)
block = Group(lbrace + locals + statement + rbrace)
iteration = Group(whileS + cond + block)
selection = Group(ifS + cond + block) | Group(ifS + cond + block + elseS + block)
statement = OneOrMore(proccall | assignment | selection | iteration | returnState)
param = Group(intVar + identifier)
paramlist = OneOrMore(Combine(param + comma)) | param
params = paramlist | voidKeyword
procedure = Group(voidKeyword + identifier + lparn + params + rparn + block)
function = Group(intVar + identifier + lparn + params + rparn + block)
declaration = variable | function | procedure
program = OneOrMore(declaration)
Me gustaría saber si hay algún error I' he hecho la traducción de la gramática y las mejoras que podría hacer para simplificarla mientras sigo la gramática que se me ha dado.
EDIT 2: Se ha actualizado para incluir el nuevo error.
Aquí es la cadena de entrada estoy de análisis: se
int larger (int first , int second) {
if (first > second) {
return first ;
} else {
return second ;
}
}
void main (void) {
int count ;
int sum ;
int max ;
int x ;
x = input () ;
max = x ;
sum = 0 ;
count = 0 ;
while (x != 0) {
count = count + 1 ;
sum = sum + x ;
max = larger (max , x) ;
x = input () ;
}
output (count) ;
output (sum) ;
output (max) ;
}
Y este es el mensaje de error que consigo cuando se ejecuta mi programa de la Terminal:
/Users/Joe/Documents/Eclipse Projects/Parser/src/pyparsing.py:1156: SyntaxWarning: null string passed to Literal; use Empty() instead
other = Literal(other)
/Users/Joe/Documents/Eclipse Projects/Parser/src/pyparsing.py:1258: SyntaxWarning: null string passed to Literal; use Empty() instead
other = Literal(other)
Expected ")" (at char 30), (line:6, col:26)
None
¿Tiene alguna pista para nosotros, como qué mensaje de error está recibiendo (si corresponde)? Usted dice "no está analizando correctamente", pero ¿cómo lo sabe? Hay un error? ¿Está generando un AST incorrecto? Se necesita más información. –
Perdón por eso. He actualizado mi pregunta con la cadena de entrada que estoy intentando analizar y los mensajes de error que recibo en la Terminal. – greenie