Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Andrey hat gesagt.:Und was soll man sich denn bitte unter einem "applet für leichte Matheaufgaben" vorstellen?
Baumartige Java-Strukturen ist schon problematisch genug,
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());}
;
ln(sqrt((a+b)/a))-ln(sqrt(1-b/a))
artanh(b/a)
Zu Zustandsautomaten, Lexern, Parsern, Compilern, Grammatiken gibt es tonnenweise Literatur. Ist sozusagen die Königsdisziplin der Informatik. Lediglich für die einzelnen Tools gibt es weniger Literatur, was einfach nur daran liegt, dass sie sich alle ähnlich sind. Das Konzept ist immer das gleiche und warum sollte man das gleiche 1000 mal wiederkäuen?starfox hat gesagt.:Finde es aber schon ein bisschen verwunderlich dass es nicht wirklich viele tutorials zu Antlr gibt, wobei man bei Java oder anderen Sprachen von Tutorials erschlagen wird.
Andrey hat gesagt.:Ein ziemlich dreckiger Trick wäre natürlich, die beiden formeln zu parsen (also eingabe sowie das erwartete ergebnis) und die an paar hundert stellen auszuwerten. Wenn man dann keinen großen numerischen Unterschied feststellt, kann man mit einer gewissen Wahrscheinlichkeit annehmen, dass derjenige, der das eingetippt hat, in etwa wusste was er da tut, und ein richtiges ergebnis geliefert hat. Das kann allerdings auch ziemlich schief gehen, etwa wenn sich jemand den scherz erlaubt, statt zB "e^pi*x" sowas wie "e^pi*x+0.0000000001" einzutippen, und dann trotzdem gesagt bekommt "ihre lösung ist richtig"