From e951b6bf9a1529937f6dc283b91183e33aad785d Mon Sep 17 00:00:00 2001 From: BartekLinux <02.bartlomiej.kuk@gmail.com> Date: Fri, 27 Mar 2026 14:17:38 +0100 Subject: [PATCH 1/3] Add: implement comparison and equality handling in visitors --- src/main/antlr4/grammar/MathLexer.g4 | 8 ++++++-- src/main/antlr4/grammar/MathParser.g4 | 3 ++- src/main/java/visitors/BasicVisitor.java | 20 +++++++++++++++++++- src/main/java/visitors/MainVisitor.java | 2 ++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/antlr4/grammar/MathLexer.g4 b/src/main/antlr4/grammar/MathLexer.g4 index 8a77e78..de75a34 100644 --- a/src/main/antlr4/grammar/MathLexer.g4 +++ b/src/main/antlr4/grammar/MathLexer.g4 @@ -14,8 +14,6 @@ WHEN : 'przy' | 'gdy' | 'dla' ; APPROACHES : 'dazy' | 'dazacym' | 'zmierza' | '->' ; -EQ - : '=' | 'rowne' ; FROM_NATURAL : 'od' | 'from'; @@ -30,6 +28,12 @@ LOGIC_IMPLIES : '=>' | 'implikuje' | 'wynika' | 'zatem' ; LOGIC_IFF : '<=>' | 'wtw' | 'wtedyitylkowtedy' | 'rownowaznie' ; LOGIC_NOT : 'nie' | 'not' | '~' ; +LEQ : '<=' | '≤' ; +GEQ : '>=' | '≥' ; +NEQ : '!=' | '<>' | '≠' ; +LT : '<' ; +GT : '>' ; +EQ : '='| '==' | 'rowne' ; TRIGONOMETRIC : 'sin' | 'sinus' | 'cos' | 'cosinus' diff --git a/src/main/antlr4/grammar/MathParser.g4 b/src/main/antlr4/grammar/MathParser.g4 index 781b709..71bcc0e 100644 --- a/src/main/antlr4/grammar/MathParser.g4 +++ b/src/main/antlr4/grammar/MathParser.g4 @@ -9,7 +9,8 @@ expression | SUM_MATH FROM_NATURAL? var=ID EQ lower=expression TO_NATURAL? upper=expression L_BRACKET body=expression R_BRACKET # Sum | PROD_MATH FROM_NATURAL? var=ID EQ lower=expression TO_NATURAL? upper=expression L_BRACKET body=expression R_BRACKET # Product | LIMIT_MATH WHEN? var=ID APPROACHES TO_NATURAL? target=expression L_BRACKET body=expression R_BRACKET # Limit - | EQ expression # Equality + | left=expression EQ right=expression? #Equality + | left=expression (LT|LEQ|GT|GEQ|NEQ) right=expression #Comparison | (L_CURLY | L_BRACKET) expression (R_CURLY | R_BRACKET) # Grouping | TRIGONOMETRIC '(' expression ')' # TrigonometricParen | expression DEGREE # Degree diff --git a/src/main/java/visitors/BasicVisitor.java b/src/main/java/visitors/BasicVisitor.java index 3ad4989..8ca156e 100644 --- a/src/main/java/visitors/BasicVisitor.java +++ b/src/main/java/visitors/BasicVisitor.java @@ -29,5 +29,23 @@ public String visitDegree(MathParser.DegreeContext ctx) { String value = main.visit(ctx.expression()); return value + "^{\\circ}"; } - + public String visitComparison(MathParser.ComparisonContext ctx) { + String left = main.visit(ctx.left); + String right = main.visit(ctx.right); + String op = ctx.getChildCount() > 1 ? ctx.getChild(1).getText() : ""; + return switch (op) { + case "<=" -> left + " \\le " + right; + case ">=" -> left + " \\ge " + right; + case "!=", "<>" -> left + " \\neq " + right; + default -> left + " " + op + " " + right; // dla < i > + }; + } + public String visitEquality(MathParser.EqualityContext ctx) { + String left = main.visit(ctx.left); + if (ctx.right != null) { + return left + " = " + main.visit(ctx.right); + } else { + return left + " = "; + } + } } \ No newline at end of file diff --git a/src/main/java/visitors/MainVisitor.java b/src/main/java/visitors/MainVisitor.java index 1025b6b..e8be576 100644 --- a/src/main/java/visitors/MainVisitor.java +++ b/src/main/java/visitors/MainVisitor.java @@ -28,6 +28,8 @@ public String visitProgram(MathParser.ProgramContext ctx) { @Override public String visitConstant(MathParser.ConstantContext ctx) { return basic.visitConstant(ctx); } @Override public String visitVariable(MathParser.VariableContext ctx) { return basic.visitVariable(ctx); } @Override public String visitGrouping(MathParser.GroupingContext ctx) { return basic.visitGrouping(ctx); } + @Override public String visitEquality(MathParser.EqualityContext ctx) { return basic.visitEquality(ctx); } + @Override public String visitComparison(MathParser.ComparisonContext ctx) { return basic.visitComparison(ctx); } // Delegacja do AlgebraVisitor (działania, potęgi) @Override public String visitAddSub(MathParser.AddSubContext ctx) { return algebra.visitAddSub(ctx); } From 1fc679f29adddd1a1d75e9bc70d9e9bd1544d1cd Mon Sep 17 00:00:00 2001 From: BartekLinux <02.bartlomiej.kuk@gmail.com> Date: Fri, 27 Mar 2026 14:36:12 +0100 Subject: [PATCH 2/3] Add: normalize decimal separator in constant visitor and update lexer/parser for number handling --- src/main/antlr4/grammar/MathLexer.g4 | 2 +- src/main/antlr4/grammar/MathParser.g4 | 4 ++-- src/main/java/visitors/BasicVisitor.java | 4 +++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/antlr4/grammar/MathLexer.g4 b/src/main/antlr4/grammar/MathLexer.g4 index de75a34..fde4b68 100644 --- a/src/main/antlr4/grammar/MathLexer.g4 +++ b/src/main/antlr4/grammar/MathLexer.g4 @@ -97,5 +97,5 @@ L_CURLY : '{' ; R_CURLY : '}' ; ID : [a-zA-Z]+ ; -INT : [0-9]+ ; +NUMBER : [0-9]+ ( ('.'|',') [0-9]+ )?; WS : [ \t\r\n]+ -> skip ; \ No newline at end of file diff --git a/src/main/antlr4/grammar/MathParser.g4 b/src/main/antlr4/grammar/MathParser.g4 index 71bcc0e..fdd0075 100644 --- a/src/main/antlr4/grammar/MathParser.g4 +++ b/src/main/antlr4/grammar/MathParser.g4 @@ -17,7 +17,7 @@ expression | LOGIC_NOT expression # LogicNot | (PLUS | MINUS) expression # UnarySign | TRIGONOMETRIC expression # TrigonometricNoParen - | left=expression UNDERSCORE right=expression # Underscore + | left=expression UNDERSCORE right=expression # Underscore | left=expression HAT right=expression # Power | left=expression right=expression # ImplicitMul | left=expression (MUL | DIV_BLOCK | DIV_LINE) right=expression # MultDiv @@ -27,5 +27,5 @@ expression | ID # Variable | GREEK # Greek | INFINITY # Infinity - | INT # Constant + | NUMBER # Constant ; \ No newline at end of file diff --git a/src/main/java/visitors/BasicVisitor.java b/src/main/java/visitors/BasicVisitor.java index 8ca156e..7d4cb6f 100644 --- a/src/main/java/visitors/BasicVisitor.java +++ b/src/main/java/visitors/BasicVisitor.java @@ -10,13 +10,15 @@ public BasicVisitor(MainVisitor main) { } public String visitConstant(MathParser.ConstantContext ctx) { - return ctx.INT().getText(); + // Normalize decimal separator so LaTeX always uses a dot. + return ctx.NUMBER().getText().replace(',', '.'); } public String visitVariable(MathParser.VariableContext ctx) { return ctx.ID().getText(); } + public String visitGrouping(MathParser.GroupingContext ctx) { String content = main.visit(ctx.expression()); return ctx.getText().startsWith("{") ? content : "(" + content + ")"; From 4a52d1bf61eda96806dbbb05939757b74011f977 Mon Sep 17 00:00:00 2001 From: BartekLinux <02.bartlomiej.kuk@gmail.com> Date: Fri, 27 Mar 2026 15:04:03 +0100 Subject: [PATCH 3/3] Add: implement function call handling in BasicVisitor and update parser grammar --- src/main/antlr4/grammar/MathLexer.g4 | 3 ++- src/main/antlr4/grammar/MathParser.g4 | 10 +++++++--- src/main/java/visitors/BasicVisitor.java | 16 ++++++++++++++-- src/main/java/visitors/MainVisitor.java | 1 + 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/main/antlr4/grammar/MathLexer.g4 b/src/main/antlr4/grammar/MathLexer.g4 index fde4b68..825e7b3 100644 --- a/src/main/antlr4/grammar/MathLexer.g4 +++ b/src/main/antlr4/grammar/MathLexer.g4 @@ -98,4 +98,5 @@ R_CURLY : '}' ; ID : [a-zA-Z]+ ; NUMBER : [0-9]+ ( ('.'|',') [0-9]+ )?; -WS : [ \t\r\n]+ -> skip ; \ No newline at end of file +WS : [ \t\r\n]+ -> skip ; +COMMA : ',' ; \ No newline at end of file diff --git a/src/main/antlr4/grammar/MathParser.g4 b/src/main/antlr4/grammar/MathParser.g4 index fdd0075..aa84a7f 100644 --- a/src/main/antlr4/grammar/MathParser.g4 +++ b/src/main/antlr4/grammar/MathParser.g4 @@ -12,20 +12,24 @@ expression | left=expression EQ right=expression? #Equality | left=expression (LT|LEQ|GT|GEQ|NEQ) right=expression #Comparison | (L_CURLY | L_BRACKET) expression (R_CURLY | R_BRACKET) # Grouping - | TRIGONOMETRIC '(' expression ')' # TrigonometricParen + | TRIGONOMETRIC L_BRACKET expression R_BRACKET # TrigonometricParen | expression DEGREE # Degree | LOGIC_NOT expression # LogicNot | (PLUS | MINUS) expression # UnarySign | TRIGONOMETRIC expression # TrigonometricNoParen | left=expression UNDERSCORE right=expression # Underscore | left=expression HAT right=expression # Power + | left=expression (DIV_BLOCK | DIV_LINE) right=expression # MultDiv + | left=expression MUL right=expression # MultDiv | left=expression right=expression # ImplicitMul - | left=expression (MUL | DIV_BLOCK | DIV_LINE) right=expression # MultDiv | left=expression (PLUS | MINUS) right=expression # AddSub | left=expression (LOGIC_AND | LOGIC_OR) right=expression # LogicAndOr | left=expression (LOGIC_IMPLIES | LOGIC_IFF) right=expression # LogicImplIff + | ID L_BRACKET argumentList R_BRACKET # FunctionCall | ID # Variable | GREEK # Greek | INFINITY # Infinity | NUMBER # Constant - ; \ No newline at end of file + ; + +argumentList : expression (COMMA expression)* ; \ No newline at end of file diff --git a/src/main/java/visitors/BasicVisitor.java b/src/main/java/visitors/BasicVisitor.java index 7d4cb6f..4962e5b 100644 --- a/src/main/java/visitors/BasicVisitor.java +++ b/src/main/java/visitors/BasicVisitor.java @@ -2,6 +2,9 @@ import grammar.MathParser; +import java.util.ArrayList; +import java.util.List; + public class BasicVisitor { private final MainVisitor main; @@ -10,7 +13,6 @@ public BasicVisitor(MainVisitor main) { } public String visitConstant(MathParser.ConstantContext ctx) { - // Normalize decimal separator so LaTeX always uses a dot. return ctx.NUMBER().getText().replace(',', '.'); } @@ -39,7 +41,7 @@ public String visitComparison(MathParser.ComparisonContext ctx) { case "<=" -> left + " \\le " + right; case ">=" -> left + " \\ge " + right; case "!=", "<>" -> left + " \\neq " + right; - default -> left + " " + op + " " + right; // dla < i > + default -> left + " " + op + " " + right; }; } public String visitEquality(MathParser.EqualityContext ctx) { @@ -50,4 +52,14 @@ public String visitEquality(MathParser.EqualityContext ctx) { return left + " = "; } } + public String visitFunctionCall(MathParser.FunctionCallContext ctx) { + String functionName = ctx.ID().getText(); + List args = new ArrayList<>(); + for (MathParser.ExpressionContext exprCtx : ctx.argumentList().expression()) { + args.add(main.visit(exprCtx)); + } + String joinedArgs = String.join(", ", args); + + return functionName + "(" + joinedArgs + ")"; + } } \ No newline at end of file diff --git a/src/main/java/visitors/MainVisitor.java b/src/main/java/visitors/MainVisitor.java index e8be576..3f4d719 100644 --- a/src/main/java/visitors/MainVisitor.java +++ b/src/main/java/visitors/MainVisitor.java @@ -26,6 +26,7 @@ public String visitProgram(MathParser.ProgramContext ctx) { // Delegacja do BasicVisitor (podstawy: liczby, zmienne, grupy) @Override public String visitConstant(MathParser.ConstantContext ctx) { return basic.visitConstant(ctx); } + @Override public String visitFunctionCall(MathParser.FunctionCallContext ctx) { return basic.visitFunctionCall(ctx); } @Override public String visitVariable(MathParser.VariableContext ctx) { return basic.visitVariable(ctx); } @Override public String visitGrouping(MathParser.GroupingContext ctx) { return basic.visitGrouping(ctx); } @Override public String visitEquality(MathParser.EqualityContext ctx) { return basic.visitEquality(ctx); }