Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions src/main/antlr4/grammar/MathLexer.g4
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ WHEN
: 'przy' | 'gdy' | 'dla' ;
APPROACHES
: 'dazy' | 'dazacym' | 'zmierza' | '->' ;
EQ
: '=' | 'rowne' ;

FROM_NATURAL
: 'od' | 'from';
Expand All @@ -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'
Expand Down Expand Up @@ -93,5 +97,6 @@ L_CURLY : '{' ;
R_CURLY : '}' ;

ID : [a-zA-Z]+ ;
INT : [0-9]+ ;
WS : [ \t\r\n]+ -> skip ;
NUMBER : [0-9]+ ( ('.'|',') [0-9]+ )?;
WS : [ \t\r\n]+ -> skip ;
COMMA : ',' ;
17 changes: 11 additions & 6 deletions src/main/antlr4/grammar/MathParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -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
;
| NUMBER # Constant
;

argumentList : expression (COMMA expression)* ;
34 changes: 33 additions & 1 deletion src/main/java/visitors/BasicVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

import grammar.MathParser;

import java.util.ArrayList;
import java.util.List;

public class BasicVisitor {
private final MainVisitor main;

Expand All @@ -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 + ")";
Expand All @@ -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<String> args = new ArrayList<>();
for (MathParser.ExpressionContext exprCtx : ctx.argumentList().expression()) {
args.add(main.visit(exprCtx));
}
String joinedArgs = String.join(", ", args);

return functionName + "(" + joinedArgs + ")";
}
}
3 changes: 3 additions & 0 deletions src/main/java/visitors/MainVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -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); }
Expand Down