Skip to content

petrsafrata/Custom_programming_language_interpreter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Interpret vlastního programovacího jazyka (Java / Maven)

Interpret jednoduchého jazyka s C-like syntaxí. Podporuje globální a lokální proměnné, funkce, procedury, pole, výrazy, podmínky a cykly. Projekt je napsán v Java 17 a sestaven pomocí Maven.


✨ Vlastnosti

  • Datové typy: int, real, string (+ literály true/false v podmínkách)
  • Proměnné: globální (global) i lokální deklarace
  • Pole: jedno- i vícerozměrná (deklarace i indexace)
  • Funkce & procedury: parametry, návratové hodnoty (function), podprogramy bez návratu (procedure)
  • Řídicí struktury: if / else, while, for
  • Výstup: print(...)
  • Výrazy: + - * /, porovnání == != < <= >= >, logika && ||
  • Syntaxe: definována EBNF (viz níže)

📂 Struktura projektu

├─ pom.xml
├─ README.md
└─ src/
   ├─ main/java/
   │  └─ cz/upce/fei/
   │     ├─ astnode/             # Definice uzlů abstraktního syntaktického stromu (AST)
   │     ├─ condition/           # Uzly a logika pro vyhodnocování podmínek (if, while, logické výrazy)
   │     ├─ declaration/         # Deklarace proměnných (globální i lokální), typů a polí
   │     ├─ exception/           # Vlastní výjimky interpretru (syntaktické, sémantické chyby apod.)
   │     ├─ expression/          # Výrazy (aritmetické, logické, přístup k proměnným a polím)
   │     ├─ function/            # Uzly a logika pro funkce (definice, parametry, návratové hodnoty)
   │     ├─ interpreter/         # Vlastní interpret AST (provádění příkazů, správa běhového prostředí)
   │     ├─ lexer/               # Tokenizace vstupu (klíčová slova, literály, operátory…)
   │     ├─ main/                # Spouštěcí třídy a entry point aplikace (např. Main.java)
   │     ├─ parameters/          # Parametry funkcí a procedur, práce s předáváním hodnot
   │     ├─ parser/              # Syntaktická analýza → převod tokenů do AST
   │     ├─ procedure/           # Uzly a logika pro procedury (volání, těla bloků)
   │     ├─ semanticanalyzer/    # Sémantická analýza (kontrola typů, deklarace proměnných, kontext)
   │     └─ statement/           # Uzly a logika pro příkazy (if, while, for, přiřazení, print…)
   └─ test/java/                 # Jednotkové testy (ověření lexeru, parseru, interpretru apod.)


▶️ Předpoklady pro spuštění

  • Java 17+
  • Apache Maven 3.8+

🧪 Rychlé příklady

1) Hello & proměnné

global string jmeno = "Petr";
                        
procedure main() {
  int i = 0;
  while(i < 3) {
    print("Ahoj", jmeno);
    i = i + 1;
  }
}

2) Funkce se součtem

function int soucet(int a, int b) {
  return a + b;
}

procedure main() {
  int x = 5;
  int y = 7;
  int s = soucet(x, y);
  print("Součet: ",s);
}

3) Pole (vč. globálního inicializátoru)

global int konst = 10;
global int A[3] = {1, 2, 3};
global int M[2][2] = {
    {1, 2},
    {3, 4}
};
                
procedure main() {
  int i = 0;
  while (i < 3) {
    int hodnota = A[i];
    print(hodnota);
    i = i + 1;
  }
int hodnota = M[1][0];
print("M[1][0] =", hodnota);
}

4) Podmínky a cykly (komplexní program)

global int a = 1;
global int c[4] = {1, 2, 3, 4};
global int result;
global string greeting = "Vítejte!";
                       
procedure main() {
  int b = 5;
  int sum = 0;
  string message = "Výpočet matice:";
  int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
  };
                                              
  print(greeting);
  print(message);
                                              
  sum = calculate_sum(matrix);
  print("Součet všech prvků matice: ", sum);
                                              
  result = factorial(5);
  print("Faktoriál čísla 5 je: ", result);
}
                                              
function int calculate_sum(int m[3][3]) {
  int i, j;
  int total = 0;
  for (i = 0; i < 3; i = i + 1) {
    for (j = 0; j < 3; j = j + 1) {
      total = total + m[i][j];
    }
  }
  return total;
}
                                              
function int factorial(int n) {
  if (n == 0) {
    return 1;
  } else {
    return n * factorial(n - 1);
  }
}

📜 EBNF – zkrácený přehled

  • Program:
    program = { global_declaration | function_declaration | procedure_declaration } ;

  • Typy a literály:
    type = "int" | "real" | "string" ;
    integer = /\d+/ ; real = /\d+\.\d+/ ; string = /"[^"]*"/ ;
    value = real | integer | string ;

  • Globální proměnné:
    global_declaration = "global" type global_variable_list ";" ;
    global_variable_declaration = ident [ "[" integer "]" { "[" integer "]" } ] [ "=" ( value | global_array_initializer ) ] ;

  • Lokální proměnné:
    local_declaration = type variable_list ";" ;
    variable_declaration = ident [ "[" expression "]" { "[" expression "]" } ] [ "=" initializer ] ;

  • Inicializátory polí:
    array_initializer = "{" value_or_nested_initializer { "," value_or_nested_initializer } "}" ;

  • Výrazy:
    expression = function_call | term { ("+" | "-" | "*" | "/") term } ;
    logical_operator = "&&" | "||" ;
    comparison_operator = "==" | "!=" | "<" | "=<" | ">=" | ">" ;
    condition = logical_term { logical_operator logical_term } | "true" | "false" ;

  • Příkazy:
    statement = local_declaration | if_statement | while_statement | assignment_statement | for_statement | return_statement | print_statement | function_call ;

  • Řídicí struktury:
    if_statement = "if" "(" condition ")" block [ "else" block ] ;
    while_statement = "while" "(" condition ")" block ;
    for_statement = "for" "(" [assignment_statement condition ";" for_assignment_statement] | [condition] ")" block ;

  • Funkce & procedury:
    function_declaration = "function" type ident "(" [ parameter_list ] ")" block ;
    procedure_declaration = "procedure" ident "(" [ parameter_list ] ")" block ;


📜 Licence

Apache-2.0 – Copyright (c) 2025 Petr Šafrata

About

Interpret jednoduchého jazyka s C-like syntaxí.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages