Вот как выглядит грамматика:
Код: Выделить всё
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]
Мобильная версия