Ich baue einen Parser für eine imaginäre Programmiersprache namens C-- (nicht die eigentliche C - Sprache). Ich bin auf die Stufe gekommen, wo ich die Grammatik der Sprache in etwas übersetzen muss, was Pyparsing akzeptieren kann. Leider, wenn ich komme, um meine Eingabe-Zeichenfolge zu analysieren (die korrekt ist und sollte nicht verursachen, dass Pyparsing zu Fehler) wird nicht ordnungsgemäß analysiert. Ich befürchte, dass dies auf Fehler in meiner Grammatik zurückzuführen ist, aber als ich zum ersten Mal mit Pyparsing anfange, kann ich nicht erkennen, wo ich falsch liege.Debugging Pyparsing Grammatik
Ich habe die Grammatik, die ich übersetze, von here hochgeladen, damit die Leute sie lesen können.
EDIT: Mit dem Rat von Paul aktualisiert.
Dies ist grammer ich zur Zeit habe (die beiden oberen Zeilen der Syntax-Definition sind furchtbar schlecht von mir, ich weiß):
# 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)
Ich mag gerne wissen, ob es irgendwelche Fehler sind ich Ich habe die Übersetzung der Grammatik gemacht und welche Verbesserungen ich machen könnte, um es zu vereinfachen, während ich mich an die Grammatik halte, die mir gegeben wurde.
EDIT 2: Aktualisiert, um den neuen Fehler zu enthalten. Hier
ist die Eingabezeichenfolge Ich bin Parsen:
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) ;
}
Und das ist die Fehlermeldung erhalte ich, wenn mein Programm vom Terminal ausgeführt wird:
/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
Haben Sie irgendwelche Hinweise für uns, z. B. welche Fehlermeldung Sie erhalten (falls vorhanden)? Du sagst "es wird nicht korrekt analysiert", aber woher weißt du das? Gibt es einen Fehler? Generiert es eine falsche AST? Weitere Informationen sind erforderlich. –
Entschuldigung. Ich habe meine Frage mit der Eingabezeichenfolge, die ich analysieren möchte, und den Fehlermeldungen, die ich in Terminal erhalte, aktualisiert. – greenie