class PParser extends Parser;
options { buildAST=true; }
imaginaryTokenDefinitions : SIGN_MINUS SIGN_PLUS ;
expr : LPAREN^ sumExpr RPAREN!;
sumExpr : prodExpr ((PLUS^|MINUS^) prodExpr)*;
prodExpr: powExpr ((MUL^|DIV^|MOD^) powExpr)*;
powExpr : signExpr (POW^ signExpr)?;
signExpr: ( m:MINUS^ {#m.setType(SIGN_MINUS); }
|p:PLUS^ {#p.setType(SIGN_PLUS); }
)? atom | SIN^ atom| COS^ atom | TAN^ atom | LOG^ atom | LN^ atom | LD^ atom | EUL^ atom |SQRT^ atom;
atom : INT | expr | CHAR;
class LLexer extends Lexer;
options {k=3;}
LPAREN: '(' ;
RPAREN: ')' ;
PLUS : '+' ;
MINUS : '-' ;
MUL : '*' ;
DIV : '/' ;
MOD : '%' ;
POW : '^' ;
SQRT : "sqrt"|"SQRT";
EUL : 'e'|'E';
SIN : "sin"|"SIN";
COS : "cos"|"COS";
TAN : "tan"|"TAN";
LN : "ln"|"LN";
LOG : "log"|"LOG";
LD : "ld"|"LD";
protected CHARACTER: (('_')* ('0'..'9')* ('a'..'z'|'A'..'Z')+ ('_')* ('0'..'9')*)+;
protected DOUBLE: ( '0'..'9' )+ ( '.' ( '0'..'9' )* )?;
INT : DOUBLE;
CHAR: CHARACTER;
class TreeWalker extends TreeParser;
expr returns [String r]
{String a,b; r=null;}
: #(PLUS a=expr b=expr) { r=Calculator.getInstance().addition(a,b); }
| #(MINUS a=expr b=expr) { r=Calculator.getInstance().sub(a,b); }
| #(MUL a=expr b=expr) { r=Calculator.getInstance().multip(a,b); }
| #(DIV a=expr b=expr) { r=Calculator.getInstance().division(a,b); }
| #(MOD a=expr b=expr) { r=Calculator.getInstance().modulo(a,b); }
| #(POW a=expr b=expr) { r=Calculator.getInstance().power(a,b); }
| #(SIN a=expr) { r=Calculator.getInstance().sin(a); }
| #(COS a=expr) { r=Calculator.getInstance().cos(a); }
| #(TAN a=expr) { r=Calculator.getInstance().tan(a); }
| #(SQRT a=expr) { r=Calculator.getInstance().sqrt(a);}
| #(EUL a=expr) { r=Calculator.getInstance().euler(a); }
| #(LOG a=expr) { r=Calculator.getInstance().logar(a); }
| #(LN a=expr) { r=Calculator.getInstance().ln(a);}
| #(LD a=expr) { r=Calculator.getInstance().ld(a);}
| #(LPAREN a=expr) { r=Calculator.getInstance().addition(a,"0");}
| #(SIGN_MINUS a=expr) { r=Calculator.getInstance().multip("-1",a);}
| #(SIGN_PLUS a=expr) { r=Calculator.getInstance().addition(a,"0");}
| i:INT { r=i.getText();}
| q:CHAR {r=Calculator.getInstance().recognizer(q.getText());}
;