Arithmetic evaluation: Difference between revisions

m (→‎{{header|Sidef}}: updated code)
Line 1,061:
 
=={{header|Elena}}==
ELENA 3.x1 :
<lang elena>#import system'routines.
#import extensions.
#import extensions'text.
 
class Token
{
object theValue.
object outprop(level) theLevel.
constructorobject new &level :aLevel: rprop(theLevel).
constructor new level:aLevel
[
theValue := StringWriter new.
Line 1,082 ⟶ 1,083:
]
number = theValue get; toReal.
}
 
class Node
{
object prop(left) :: prop(theLeft).
object prop(right) :: prop(theRight).
object outprop(level) :: rprop(theLevel).
 
constructor new &level:aLevel
[
theLevel := aLevel.
Line 1,099 ⟶ 1,100:
class SummaryNode :: Node
{
constructor new &level:aLevel
<= new &level:(aLevel + 1).
number = theLeft number + theRight number.
Line 1,107 ⟶ 1,108:
class DifferenceNode :: Node
{
constructor new &level:aLevel
<= new &level:(aLevel + 1).
number = theLeft number - theRight number.
Line 1,115 ⟶ 1,116:
class ProductNode :: Node
{
constructor new &level:aLevel
<= new &level:(aLevel + 2).
number = theLeft number * theRight number.
Line 1,123 ⟶ 1,124:
class FractionNode :: Node
{
constructor new &level:aLevel
<= new &level:(aLevel + 2).
number = theLeft number / theRight number.
Line 1,131 ⟶ 1,132:
class Expression
{
object outprop(level) :: rprop(theLevel).
object prop(top) :: prop(theTop).
constructor new &level:aLevel
[
theLevel := aLevel.
]
right = theTop.
 
set &right:aNode [ theTop := aNode. ]
number => theTop.
Line 1,149 ⟶ 1,150:
[
ch =>
#$40 [ // (
selfclosure new &bracket; goto &start.starting
];
! [
selfclosure new &token; append:ch; goto &token.
].
].
Line 1,160 ⟶ 1,161:
[
ch =>
#$41 [ // )
selfclosure close &bracket; goto &token.
];
#$42 [ // *
selfclosure new &product; goto &operator.
];
#$43 [ // +
selfclosure new &summary; goto &operator.
];
#$45 [ // -
selfclosure new &difference; goto &operator.
];
#$47 [ // /
selfclosure new &fraction; goto &operator.
];
! [
selfclosure append:ch.
].
].
Line 1,183 ⟶ 1,184:
[
ch =>
#$40 [ // (
selfclosure new &bracket; goto &start.starting
];
#$45 [ // -
selfclosure new &token; append &literal:"0"; new &difference; goto &operator.
];
! [
selfclosure new &token; append:ch; goto &token.
].
].
Line 1,202 ⟶ 1,203:
object theExpression.
constructor new &parser:aParser
[
theState := startState.
theLevel := 0.
theExpression := Expression new &level:0.
theParser := aParser.
]
new &token
[
theToken := theParser appendToken &expression:theExpression &level:theLevel.
]
new &summary
[
theToken := nil.
theParser appendSummary &expression:theExpression &level:theLevel.
]
new &difference
[
theToken := nil.
theParser appendDifference &expression:theExpression &level:theLevel.
]
new &product
[
theToken := nil.
theParser appendProduct &expression:theExpression &level:theLevel.
]
new &fraction
[
theToken := nil.
theParser appendFraction &expression:theExpression &level:theLevel.
]
 
new &bracket
[
theToken := nil.
Line 1,249 ⟶ 1,250:
theLevel := theLevel + 10.
theParser appendSubexpression &expression:theExpression &level:theLevel.
]
 
close &bracket
[
if (theLevel < 10)
[ InvalidArgumentException new &message:"Invalid expression"; raise. ].
theLevel := theLevel - 10.
]
append:ch
[
if((ch >= #$48) && (ch < #$58))
[ theToken append:ch. ];
[ InvalidArgumentException new &message:"Invalid expression"; raise. ].
]
append &literal:aLiteral
[
aLiteral run &each: (:ch )[ self append:ch. ].
]
goto &startstarting
[
theState := startState.
]
goto &token
[
theState := tokenState.
]
goto &operator
[
theState := operatorState.
]
Line 1,294 ⟶ 1,295:
class Parser
{
appendToken &expression:anExpression &level:aLevel
[
var aToken := Token new &level:aLevel.
anExpression set &top:($self append &last:(anExpression top) &new:aToken).
^ aToken.
]
 
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)).
]
 
append &last:aLastNode &new:aNewNode
[
if($nil == aLastNode)
? [ ^ aNewNode. ].
if (aNewNode level <= aLastNode level)
[ aNewNode set &left:aLastNode. ^ aNewNode. ].
var aParent := aLastNode.
var aCurrent := aLastNode right.
while (($nil != aCurrent) && [ $(aNewNode level > aCurrent level ]))
[ aParent := aCurrent. aCurrent := aCurrent right. ].
if ($nil == aCurrent)
[ aParent set &right:aNewNode. ];
[ aNewNode set &left:aCurrent. aParent set &right:aNewNode. ].
^ aLastNode.
]
run : aText
[
var aScope := Scope new &parser:$self.
 
aText run &each: (:ch )[ aScope eval:ch. ].
 
^ aScope number.
]
}
Line 1,363 ⟶ 1,364:
var aParser := Parser new.
 
[ $(console readLine; save &to:aText; length > 0]) doWhile:
[
try(console writeLine:"=" :(aParser run:aText))
{
!generic : e [
console writeLine:"Invalid Expression".
]
}.
aText clear.
].
].</lang>
Anonymous user