Anonymous user
Arithmetic evaluation: Difference between revisions
→{{header|Elena}}
m (→{{header|Sidef}}: updated code) |
|||
Line 1,061:
=={{header|Elena}}==
ELENA 3.
<lang elena>
class Token
{
object theValue.
constructor new level:aLevel
[
theValue := StringWriter new.
Line 1,082 ⟶ 1,083:
]
number = theValue get; toReal.
}
class Node
{
object
object
object
constructor new
[
theLevel := aLevel.
Line 1,099 ⟶ 1,100:
class SummaryNode :: Node
{
constructor new
<= new
number = theLeft number + theRight number.
Line 1,107 ⟶ 1,108:
class DifferenceNode :: Node
{
constructor new
<= new
number = theLeft number - theRight number.
Line 1,115 ⟶ 1,116:
class ProductNode :: Node
{
constructor new
<= new
number = theLeft number * theRight number.
Line 1,123 ⟶ 1,124:
class FractionNode :: Node
{
constructor new
<= new
number = theLeft number / theRight number.
Line 1,131 ⟶ 1,132:
class Expression
{
object
object
constructor new
[
theLevel := aLevel
]
right = theTop.
set
number => theTop.
Line 1,149 ⟶ 1,150:
[
ch =>
];
! [
].
].
Line 1,160 ⟶ 1,161:
[
ch =>
];
];
];
];
];
! [
].
].
Line 1,183 ⟶ 1,184:
[
ch =>
];
];
! [
].
].
Line 1,202 ⟶ 1,203:
object theExpression.
constructor new
[
theState := startState.
theLevel := 0.
theExpression := Expression new
theParser := aParser.
]
new
[
theToken := theParser appendToken
]
new
[
theToken := nil.
theParser appendSummary
]
new
[
theToken := nil.
theParser appendDifference
]
new
[
theToken := nil.
theParser appendProduct
]
new
[
theToken := nil.
theParser appendFraction
]
new
[
theToken := nil.
Line 1,249 ⟶ 1,250:
theLevel := theLevel + 10.
theParser appendSubexpression
]
close
[
if (theLevel < 10)
[ InvalidArgumentException new
theLevel := theLevel - 10
]
append:ch
[
if((ch >=
[ theToken append:ch
[ InvalidArgumentException new
]
append
[
aLiteral run
]
goto
[
theState := startState
]
goto
[
theState := tokenState
]
goto
[
theState := operatorState
]
Line 1,294 ⟶ 1,295:
class Parser
{
appendToken
[
var aToken := Token new
anExpression set
^ aToken
]
appendSummary
[
anExpression set
]
appendDifference
[
anExpression set
]
appendProduct
[
anExpression set
]
appendFraction
[
anExpression set
]
appendSubexpression
[
anExpression set
]
append
[
if($nil == aLastNode)
if (aNewNode level <= aLastNode level)
[ aNewNode set
var aParent := aLastNode.
var aCurrent := aLastNode right.
while (($nil != aCurrent) &&
[ aParent := aCurrent. aCurrent := aCurrent right. ].
if ($nil == aCurrent)
[ aParent set
[ aNewNode set
^ aLastNode
]
run : aText
[
var aScope := Scope new
aText run
^ aScope number
]
}
Line 1,363 ⟶ 1,364:
var aParser := Parser new.
[
try(console writeLine:"=" :(aParser run:aText))
{
console writeLine:"Invalid Expression"
]
}.
aText clear
].
].</lang>
|