Ошибка при построении грамматического дерева antlrJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Ошибка при построении грамматического дерева antlr

Сообщение Anonymous »

Я создаю грамматику antlr для своего языка. Однако я столкнулся с проблемой, связанной с циклом for, который я пытаюсь описать как в C++.
Вот как выглядит грамматика:

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

grammar Baru;

@header {
package org.example.gen;
}

// Main entry point
program: stmt* EOF;

// Statements
stmt: varDecl
| assignment
| print
| ifstmt
| whilestmt
| forstmt
| blockstmt;

// Expressions
expr: '(' expr ')'                        #parenthesisExpr
| left=expr op=(ASTERISK | SLASH) right=expr    #mulDivExpr
| left=expr op=(PLUS | MINUS) right=expr        #plusMinusExpr
| left=expr op=(AND | OR) right=expr            #logicalExpr
| left=expr compOperator right=expr             #compExpr
| ID                                            #idExpr
| NUM                                           #numExpr
| BOOL                                          #boolExpr
| STRING                                        #stringExpr;

// Comparison operators
compOperator: op=(LESS | LESS_OR_EQUAL | EQUAL | NOT_EQUAL | GREATER | GREATER_OR_EQUAL);

// Variable declaration
varDecl: 'var' ID ('=' expr)? ';' ;

// Assignment
assignment: ID '=' expr ';' ;

// Print statement
print: 'print' '(' expr ')' ';' ;

// Conditional statements
ifstmt: 'if' '(' expr ')' stmt (elifstmt)* (elsestmt)? ;
elifstmt: 'elif' '(' expr ')' stmt ;
elsestmt: 'else' stmt ;

// Loops
whilestmt: 'while' '(' expr ')' stmt ;
forstmt: 'for' '(' (varDeclFor | assignmentFor)? ';' expr? ';' assignmentFor? ')' stmt ;

varDeclFor: 'var' ID ('=' expr)?;
assignmentFor: ID '=' expr;

// Blocks
blockstmt: '{' stmt* '}' ;

// Tokens
ID       : [a-zA-Z_][a-zA-Z_0-9]* ;       // Identifiers
NUM      : [0-9]+ ;                       // Integers
BOOL     : 'true' | 'false';              // Boolean values
STRING   : '"' (~["\r\n])* '"' ;          // Strings
ASTERISK : '*' ;
SLASH    : '/' ;
PLUS     : '+' ;
MINUS    : '-' ;
AND      : '&&' ;
OR       : '||' ;
EQUAL    : '==' ;
NOT_EQUAL: '!=' ;
LESS     : '=' ;

// Skip whitespace and comments
SPACE    : [ \t\r\n]+ -> skip ;
COMMENT  : '/*' .*? '*/' -> skip ;
LINE_COMMENT : '//' ~[\r\n]* -> skip ;
Мой тестовый код:

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

import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;

public class Main {
public static void main(String[] args)  {
String code = """
var x = 10;
var y = 20;
var result;

if (x < y) {
result = x + y;
} elif (x == y) {
result = 0;
} else {
result = x - y;
}

print("Result is: " + result);

while (x > 0) {
print(x);
x = x - 1;
}

for (var i = 0; i < 5; i = i + 1) {
print("Loop iteration: "  + i);
}

""";
com.example.gen.AntlrProjectLexer lexer = new com.example.gen.AntlrProjectLexer(CharStreams.fromString(code));
CommonTokenStream tokens = new CommonTokenStream(lexer);
com.example.gen.AntlrProjectParser parser = new com.example.gen.AntlrProjectParser(tokens);
ParseTree tree = parser.program();
System.out.println(tree.toStringTree(parser));
}
}
Вот что я получаю на выходе:

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

line 20:5 extraneous input 'var' expecting {';', ID}
line 20:32 missing ';' at ')'

(program (stmt (varDecl var x = (expr 10) ;)) (stmt (varDecl var y = (expr 20) ;)) (stmt (varDecl var result ;)) (stmt (ifstmt if ( (expr (expr x) (compOperator ) (expr 0)) ) (stmt (blockstmt { (stmt (print print ( (expr x) ) ;)) (stmt (assignment x = (expr (expr x) - (expr 1)) ;)) })))) (stmt (forstmt for ( var (assignment i = (expr 0) ;) (expr (expr i) (compOperator 

Подробнее здесь: [url]https://stackoverflow.com/questions/79239062/error-in-constructing-the-antlr-grammar-tree[/url]
Ответить

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

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

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

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

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