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, die Kommas enthält. Unten finden Sie den Code für den PLY-Code sowie ein Beispiel des Quellcodes, den ich verwende und der den Fehler verursacht. Pascal.py
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.
Num1 is 10
Num2 is 20
Num3 is 30
Sum 3 numbers is 60
Average is 2.0000000000000000E+001
Ich habe meine Token-Definitionen und meine Grammatik überprüft, kann aber nicht herausfinden, warum der Parser Probleme mit dem Komma in der WRITELN-Anweisung hat. Könnte mir jemand helfen herauszufinden, was falsch läuft?
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, die Kommas enthält. Unten finden Sie den Code für den PLY-Code sowie ein Beispiel des Quellcodes, den ich verwende und der den Fehler verursacht. [b]Pascal.py[/b] [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]Beispielquellcode (SumAndAverage.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] [code]python Pascal.py SumAndAverage.pas [/code] [code]Num1 is 10 Num2 is 20 Num3 is 30 Sum 3 numbers is 60 Average is 2.0000000000000000E+001 [/code] Ich habe meine Token-Definitionen und meine Grammatik überprüft, kann aber nicht herausfinden, warum der Parser Probleme mit dem Komma in der WRITELN-Anweisung hat. Könnte mir jemand helfen herauszufinden, was falsch läuft?
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...
Ich habe die genaue Arbeitsweise eines Dolmetschers herausgefunden, habe gegoogelt und bin auf eine Schlussfolgerung gekommen. Ich wollte nur, dass sie von jemandem korrigiert wird, der mir 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.