Арабская грамматика в Antlr 4JAVA

Программисты JAVA общаются здесь
Anonymous
Арабская грамматика в Antlr 4

Сообщение Anonymous »

Я хотел создать простой тест, чтобы посмотреть, возможно ли создать небольшой и простой язык программирования, но с арабскими словами, которые эквивалентны таким словам, как: печать, переменная, функция и т. д. на английском языке, после прочтения части руководства antlr, а также поиск здесь, я не смог найти ответ на следующий вопрос: в арабском языке используются разные буквы, но также и разные способы написания чисел, поэтому ٠١٢٣٤٥٦٧٨٩ вместо 0123456789, мне удалось заставить его работать на Mac OS , со следующими инструментами: Intelji IDE, пакет antlr, упомянутый на веб-сайте antlr4 для Intelji ide, а также использовал jar двоичных файлов среды выполнения ANTLR 4.13.2 Java. но это вызывает много проблем в Windows:
вот код, который я тестировал, использовал его как в Windows, так и в Mac OS:
ArabicLang.g4: grammar ArabicLang;

prog: statement* EOF;

statement
: declareStatement
| assignStatement
| printStatement
| ifStatement
;

declareStatement
: 'متغير' VAR_NAME '؛'
;

assignStatement
: VAR_NAME '=' expr '؛'
;

printStatement
: 'طباعة' VAR_NAME '؛'
;

ifStatement
: 'إذا' '(' expr ')' '{' statement* '}'
;

expr
: expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| expr '' expr
| expr '==' expr
| expr '!=' expr
| expr '&&' expr
| expr '||' expr
| INT
| VAR_NAME
;

VAR_NAME
: [\u0621-\u064A]+;

INT
: [٠-٩]+;

WS: [ \t\r\n]+ -> skip;


ArabicIntrepeter.java: package src;

import java.util.HashMap;
import java.util.Map;

public class ArabicInterpreter extends ArabicLangBaseVisitor {

private Map symbolTable = new HashMap();
private Map declaredVariables = new HashMap();

@Override
public Object visitDeclareStatement(ArabicLangParser.DeclareStatementContext ctx) {
String varName = ctx.VAR_NAME().getText();
if (declaredVariables.containsKey(varName)) {
throw new RuntimeException("متغير مُعلن بالفعل: " + varName);
}
declaredVariables.put(varName, true);
return null;
}

@Override
public Object visitAssignStatement(ArabicLangParser.AssignStatementContext ctx) {
String varName = ctx.VAR_NAME().getText();
if (!declaredVariables.containsKey(varName)) {
throw new RuntimeException("متغير غير مُعلن: " + varName);
}
int value = (int) visit(ctx.expr());
symbolTable.put(varName, value);
return null;
}

@Override
public Object visitPrintStatement(ArabicLangParser.PrintStatementContext ctx) {
String varName = ctx.VAR_NAME().getText();
if (!symbolTable.containsKey(varName)) {
throw new RuntimeException("متغير غير مُعرف: " + varName);
}
System.out.println(symbolTable.get(varName));
return null;
}

@Override
public Object visitIfStatement(ArabicLangParser.IfStatementContext ctx) {
int condition = (int) visit(ctx.expr());
if (condition != 0) {
for (ArabicLangParser.StatementContext statementCtx : ctx.statement()) {
visit(statementCtx);
}
}
return null;
}

@Override
public Object visitExpr(ArabicLangParser.ExprContext ctx) {
if (ctx.INT() != null) {
return Integer.parseInt(ctx.INT().getText());
} else if (ctx.VAR_NAME() != null) {
String varName = ctx.VAR_NAME().getText();
if (!declaredVariables.containsKey(varName)) {
throw new RuntimeException("متغير غير مُعلن: " + varName);
}
if (!symbolTable.containsKey(varName)) {
throw new RuntimeException("متغير غير مُهيأ: " + varName);
}
return symbolTable.get(varName);
} else {
int left = (int) visit(ctx.expr(0));
int right = (int) visit(ctx.expr(1));
switch (ctx.getChild(1).getText()) {
case "+":
return left + right;
case "-":
return left - right;
case "*":
return left * right;
case "/":
return left / right;
case "":
return left > right ? 1 : 0;
case "==":
return left == right ? 1 : 0;
case "!=":
return left != right ? 1 : 0;
case "&&":
return (left != 0 && right != 0) ? 1 : 0;
case "||":
return (left != 0 || right != 0) ? 1 : 0;
}
}
return 0; // Default return (not reachable)
}
}


import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import src.*;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

public class ArabicLangMain {
public static void main(String[] args) throws IOException {
// Define the file path (fixed file "source.arabic")
String filePath = "source.arabic";

// Read the source code from the file
String source = new String(Files.readAllBytes(Paths.get(filePath)));

// Create an ANTLR input stream from the source code
CharStream input = CharStreams.fromString(source);

// Create a lexer that feeds off of the input stream
ArabicLangLexer lexer = new ArabicLangLexer(input);

// Create a buffer of tokens between the lexer and parser
CommonTokenStream tokens = new CommonTokenStream(lexer);

// Create a parser that feeds off the tokens
ArabicLangParser parser = new ArabicLangParser(tokens);

// Parse the program
ParseTree tree = parser.prog();

// Visit the parse tree using the interpreter
ArabicInterpreter interpreter = new ArabicInterpreter();
interpreter.visit(tree);
}
}


source.arabic:
متغير عدد؛
عدد = ٣؛
طباعة عدد؛
متغير مجموع؛
مجموع = عدد * ٢؛
طباعة مجموع؛
مجموع = عدد - ١؛
طباعة مجموع؛
مجموع = عدد / ٢؛
طباعة مجموع؛


Подробнее здесь: https://stackoverflow.com/questions/790 ... in-antlr-4

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