ANTLR — значения не назначаются в визитном литерале, Слева: ноль, Справа: ноль, Оператор: <JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 ANTLR — значения не назначаются в визитном литерале, Слева: ноль, Справа: ноль, Оператор: <

Сообщение Anonymous »

Существует код класса STInterpreter, который затем получает код:

Код: Выделить всё

package com.jdcs.st;

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import java.util.HashMap;
import java.util.Map;
import com.jdcs.st.generated.*;

public class STInterpreter {
private final Map symbolTable = new HashMap();

public void execute(String code) {
STLexer lexer = new STLexer(CharStreams.fromString(code));
STParser parser = new STParser(new CommonTokenStream(lexer));
ParseTree tree = parser.program();

new STVisitor().visit(tree);
}

private class STVisitor extends STBaseVisitor {
@Override
public Object visitAssignment(STParser.AssignmentContext ctx) {
String variable = ctx.IDENTIFIER().getText();
Object value = visit(ctx.expression());

System.out.println("Assigning " + value + " to " + variable); // Диагностика

symbolTable.put(variable, value);

// Вывод текущего состояния таблицы символов
System.out.println("Symbol Table: " + symbolTable);
return null;
}

@Override
public Object visitLiteral(STParser.LiteralContext ctx) {
if (ctx.INT() != null) return Integer.parseInt(ctx.INT().getText());
if (ctx.BOOL() != null) return Boolean.parseBoolean(ctx.BOOL().getText());
return null;
}

@Override
public Object visitExpression(STParser.ExpressionContext ctx) {
if (ctx.operator() == null) {
return visit(ctx.literal() != null ? ctx.literal() : ctx.IDENTIFIER());
}

Object left = visit(ctx.expression(0));
Object right = visit(ctx.expression(1));
String operator = ctx.operator().getText();

System.out.println("Left: " + left + ", Right: " + right + ", Operator: " + operator);

return evaluate(left, right, operator);
}

private Object evaluate(Object left, Object right, String operator) {
switch (operator) {
case "+" -> {
return (int) left + (int) right;
}
case "-" -> {
return (int) left - (int) right;
}
case "*" -> {
return (int) left * (int) right;
}
case "/" -> {
return (int) left / (int) right;
}
case "=" -> {
return left.equals(right);
}
case "" -> {
return (int) left > (int) right;
}
}
throw new RuntimeException("Unsupported operator: " + operator);
}

@Override
public Object visitCondition(STParser.ConditionContext ctx) {
return visit(ctx.expression());
}

@Override
public Object visitIfStatement(STParser.IfStatementContext ctx) {
boolean condition = (boolean) visit(ctx.condition());
if (condition) {
ctx.statement().forEach(this::visit);
} else if (ctx.statement().size() > 1) {
visit(ctx.statement(1));
}
return null;
}
}
}
и для кода

Код: Выделить всё

STInterpreter interpreter = new STInterpreter();
String code = """
x := 10;
y := 20;
IF x < y THEN
z := x + y;
END_IF;
""";
interpreter.execute(code);
становится

Код: Выделить всё

Assigning 10 to x
Assigning 20 to y
Left: null, Right: null, Operator: <
Почему присвоение происходит, но не обрабатывается как правильная операция?

Подробнее здесь: https://stackoverflow.com/questions/793 ... ht-null-op
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Преобразование грамматики Antlr 4 в Antlr 3.5
    Anonymous » » в форуме Php
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Контейнеры STL назначаются копией? [дубликат]
    Anonymous » » в форуме C++
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Клубы не назначаются автоматически в матчах, созданных wpforms в плагине Sportspress
    Anonymous » » в форуме Php
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Слишком много символов в символьном литерале – попытка проверить, не находится ли мое значение в пределах значений ASCII
    Anonymous » » в форуме JAVA
    0 Ответы
    59 Просмотры
    Последнее сообщение Anonymous
  • Что означают символы подчеркивания в числовом литерале в C#?
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»