Ich arbeite an einem einfachen pascalähnlichen Dolmetscher mit PLY, aber ich begegne einen Syntaxfehler bei ',' während der Parsen. Das Problem tritt auf, wenn versucht wird, eine Quelldatei zu analysieren, die Kommas enthält. Unten ist der Code für den Ply -Code sowie ein Beispiel des Quellcode, den ich verwende, der den Fehler verursacht.
PROGRAM SUMANDAVERAGE;
VAR num1,num2,num3: integer;
sum:integer;
avg:real;
BEGIN
num1:=10;
num2:=20;
num3:=30;
sum:=num1+num2+num3;
avg:=sum/3;
WRITELN('Num1 is ',num1);
WRITELN('Num2 is ',num2);
WRITELN('Num3 is ',num3);
WRITELN('Sum 3 numbers is ',sum);
WRITELN('Average is ',avg)
END.
Eingabe und die erwartete Ausgabe
python Pascal.py SumAndAverage.pas
< /code>
Num1 is 10
Num2 is 20
Num3 is 30
Sum 3 numbers is 60
Average is 2.0000000000000000E+001
< /code>
I've reviewed my token definitions and grammar, but I can't figure out why the parser is having trouble with the comma in the WRITELN statement. Could someone help me figure out what's going wrong?
Ich arbeite an einem einfachen pascalähnlichen Dolmetscher mit PLY, aber ich begegne einen Syntaxfehler bei ',' während der Parsen. Das [url=viewtopic.php?t=15738]Problem[/url] tritt auf, wenn versucht wird, eine Quelldatei zu analysieren, die Kommas enthält. Unten ist der Code für den Ply -Code sowie ein Beispiel des Quellcode, den ich verwende, der den Fehler verursacht.[code]import ply.lex as lex import ply.yacc as yacc
def p_program(p): 'program : PROGRAM ID SEMICOLON declarations BEGIN statements END DOT' interpret(p[5]) # Pass the parsed statements to the interpreter
def p_declarations(p): '''declarations : VAR var_declaration | empty'''
def p_var_declaration(p): '''var_declaration : ID COLON type SEMICOLON var_declaration | ID COLON type SEMICOLON'''
def p_expression(p): '''expression : expression PLUS term | expression DIVIDE term | term''' if len(p) == 4: p[0] = (p[2], p[1], p[3]) else: p[0] = p[1]
def p_term(p): '''term : ID | NUMBER''' p[0] = p[1]
def p_empty(p): 'empty :' p[0] = []
def p_error(p): print(f"Syntax error at '{p.value}'" if p else "Syntax error at EOF")
parser = yacc.yacc()
# Interpreter variables = {}
def evaluate(tree): if isinstance(tree, (int, float)): return tree if isinstance(tree, str): return variables.get(tree, 0) if tree[0] == '+': return evaluate(tree[1]) + evaluate(tree[2]) if tree[0] == '/': return evaluate(tree[1]) / evaluate(tree[2]) return 0
def interpret(statements): for stmt in statements: if stmt[0] == 'ASSIGN': variables[stmt[1]] = evaluate(stmt[2]) elif stmt[0] == 'WRITELN': print(" ".join(str(evaluate(arg)) if not isinstance(arg, str) else arg for arg in stmt[1]))
# Run the Program if __name__ == '__main__': import sys if len(sys.argv) < 2: print("Usage: python Pascal.py ") sys.exit(1) with open(sys.argv[1], 'r') as file: source = file.read() lexer.input(source) parser.parse(source) [/code] [b] Beispielquellencode (Sumaaverwut.Pas) [/b] [code]PROGRAM SUMANDAVERAGE; VAR num1,num2,num3: integer; sum:integer; avg:real; BEGIN num1:=10; num2:=20; num3:=30; sum:=num1+num2+num3; avg:=sum/3; WRITELN('Num1 is ',num1); WRITELN('Num2 is ',num2); WRITELN('Num3 is ',num3); WRITELN('Sum 3 numbers is ',sum); WRITELN('Average is ',avg) END. [/code] [b] Eingabe und die erwartete Ausgabe [/b] python Pascal.py SumAndAverage.pas < /code> Num1 is 10 Num2 is 20 Num3 is 30 Sum 3 numbers is 60 Average is 2.0000000000000000E+001 < /code> I've reviewed my token definitions and grammar, but I can't figure out why the parser is having trouble with the comma in the WRITELN statement. Could someone help me figure out what's going wrong?
Ich arbeite an einem einfachen Pascal-ähnlichen Interpreter mit PLY, aber beim Parsen tritt bei „,“ ein Syntaxfehler auf. Das Problem tritt auf, wenn versucht wird, eine Quelldatei zu analysieren,...
Ich benutze MyPy , um verwandte Fehler zu prüfen, bevor ich meinen Code ausführte. Ich verwende dynamische Variablen und MyPy kann es nicht überprüfen.
Ich kenne Pydantic . Aber das ist ein...
Ich lerne modernes C++ und bin ein Experte des funktionalen Paradigmas . Hier ist die Situation: Ich möchte die Zeilen im Pascal-Dreieck mit C++23 und seiner Ranges-Bibliothek berechnen.
Hier ist die...
Ich stoße auf ein Problem mit PLY (Python Lex-Yacc), bei dem ein Token im von mir definierten Parser nicht erkannt wird. Dieser Fehler verhindert, dass der Parser erstellt wird.