diff --git a/src/main/antlr4/grammar/MathLexer.g4 b/src/main/antlr4/grammar/MathLexer.g4 index 8a77e78..825e7b3 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' @@ -93,5 +97,6 @@ L_CURLY : '{' ; R_CURLY : '}' ; ID : [a-zA-Z]+ ; -INT : [0-9]+ ; -WS : [ \t\r\n]+ -> skip ; \ No newline at end of file +NUMBER : [0-9]+ ( ('.'|',') [0-9]+ )?; +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 781b709..aa84a7f 100644 --- a/src/main/antlr4/grammar/MathParser.g4 +++ b/src/main/antlr4/grammar/MathParser.g4 @@ -9,22 +9,27 @@ 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 + | 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 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 - | INT # Constant - ; \ No newline at end of file + | NUMBER # Constant + ; + +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 3ad4989..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,13 +13,14 @@ public BasicVisitor(MainVisitor main) { } public String visitConstant(MathParser.ConstantContext ctx) { - return ctx.INT().getText(); + 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 + ")"; @@ -29,5 +33,33 @@ 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; + }; + } + 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 + " = "; + } + } + 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 1025b6b..3f4d719 100644 --- a/src/main/java/visitors/MainVisitor.java +++ b/src/main/java/visitors/MainVisitor.java @@ -26,8 +26,11 @@ 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); } + @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); }