Я работаю над простым интерпретатором, подобным Паскалю, с использованием PLY, но во время синтаксического анализа обнаружил синтаксическую ошибку ','. Проблема возникает при попытке проанализировать исходный файл, содержащий запятые. Ниже приведен код кода PLY, а также образец используемого мной исходного кода, вызывающего ошибку. 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
Я просмотрел определения и грамматику своих токенов, но не могу понять, почему у синтаксического анализатора возникают проблемы с запятой в операторе WRITELN. Может ли кто-нибудь помочь мне понять, что происходит не так?
Я работаю над простым интерпретатором, подобным Паскалю, с использованием PLY, но во время синтаксического анализа обнаружил синтаксическую ошибку ','. Проблема возникает при попытке проанализировать исходный файл, содержащий запятые. Ниже приведен код кода PLY, а также образец используемого мной исходного кода, вызывающего ошибку. [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]Пример исходного кода (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]Входные данные и ожидаемый результат[/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] Я просмотрел определения и грамматику своих токенов, но не могу понять, почему у синтаксического анализатора возникают проблемы с запятой в операторе WRITELN. Может ли кто-нибудь помочь мне понять, что происходит не так?