Arithmetic evaluation: Difference between revisions

Line 1,061:
 
=={{header|Elena}}==
ELENA 3.12 :
<lang elena>import system'routines.
import extensions.
Line 1,070:
object theValue.
object rprop level :: rprop(theLevel).
constructor new level:aLevel
Line 1,088:
class Node
{
object prop left :: prop(theLeft).
object prop right :: prop(theRight).
object rprop level :: rprop(theLevel).
 
constructor new level:aLevel
Line 1,101:
{
constructor new level:aLevel
<= new level:(aLevel + 1).
number = theLeft number + theRight number.
Line 1,109:
{
constructor new level:aLevel
<= new level:(aLevel + 1).
number = theLeft number - theRight number.
Line 1,117:
{
constructor new level:aLevel
<= new level:(aLevel + 2).
number = theLeft number * theRight number.
Line 1,125:
{
constructor new level:aLevel
<= new level:(aLevel + 2).
number = theLeft number / theRight number.
Line 1,132:
class Expression
{
object rprop level :: rprop(theLevel).
object prop top :: prop(theTop).
constructor new level:aLevel
Line 1,151:
ch =>
$40 [ // (
^ closure new bracketnewBracket; goto startinggotoStarting
];
! [
^ closure new tokennewToken; append:ch; goto tokengotoToken
].
].
Line 1,162:
ch =>
$41 [ // )
^ closure close bracketcloseBracket; goto tokengotoToken
];
$42 [ // *
^ closure new productnewProduct; goto operatorgotoOperator
];
$43 [ // +
^ closure new summarynewSummary; goto operatorgotoOperator
];
$45 [ // -
^ closure new differencenewDifference; goto operatorgotoOperator
];
$47 [ // /
^ closure new fractionnewFraction; goto operatorgotoOperator
];
! [
^ closure append:ch
].
].
Line 1,185:
ch =>
$40 [ // (
^ closure new bracketnewBracket; goto startinggotoStarting
];
$45 [ // -
^ closure new tokennewToken; append literal:"0"; new differencenewDifference; goto operatorgotoOperator
];
! [
^ closure new tokennewToken; append:ch; goto tokengotoToken
].
].
Line 1,211:
]
new tokennewToken
[
theToken := theParser appendToken expression:theExpression level:theLevel.
]
new summarynewSummary
[
theToken := nil.
Line 1,223:
]
new differencenewDifference
[
theToken := nil.
Line 1,230:
]
new productnewProduct
[
theToken := nil.
Line 1,237:
]
new fractionnewFraction
[
theToken := nil.
Line 1,244:
]
 
new bracketnewBracket
[
theToken := nil.
Line 1,253:
]
 
close bracketcloseBracket
[
if (theLevel < 10)
Line 1,270:
append literal:aLiteral
[
aLiteral run each: forEach(:ch)[ self append:ch ]
]
goto startinggotoStarting
[
theState := startState
]
goto tokengotoToken
[
theState := tokenState
]
goto operatorgotoOperator
[
theState := operatorState
Line 1,299:
var aToken := Token new level:aLevel.
anExpression set top:($self append last:(anExpression top) new:aToken).
^ aToken
Line 1,306:
appendSummary expression:anExpression level:aLevel
[
anExpression set top:($self append last:(anExpression top) new:(SummaryNode new level:aLevel)).
]
 
appendDifference expression:anExpression level:aLevel
[
anExpression set top:($self append last:(anExpression top) new:(DifferenceNode new level:aLevel)).
]
 
appendProduct expression:anExpression level:aLevel
[
anExpression set top:($self append last:(anExpression top) new:(ProductNode new level:aLevel)).
]
 
appendFraction expression:anExpression level:aLevel
[
anExpression set top:($self append last:(anExpression top) new:(FractionNode new level:aLevel))
]
 
appendSubexpression expression:anExpression level:aLevel
[
anExpression set top:($self append last:(anExpression top) new:(Expression new level:aLevel)).
]
 
Line 1,353:
var aScope := Scope new parser:$self.
 
aText run each: forEach(:ch)[ aScope eval:ch ].
 
^ aScope number
Line 1,364:
var aParser := Parser new.
 
$(console readLine; save tosaveTo:aText; length > 0) doWhile:
[
try(console writeLine:printLine("=" :(,aParser run:aText))
{
generic :on(Exception e [)
[
console writeLine:"Invalid Expression"
]
Anonymous user