Arithmetic evaluation: Difference between revisions

(→‎{{header|Perl 6}}: Combine into a single file for ease of testing, fix return type)
Line 1,061:
 
=={{header|Elena}}==
ELENA 3.34 :
<lang elena>import system'routines.
import extensions.
Line 1,068:
class Token
{
object theValue.
objectint rprop level :: theLevel.
constructor new(int level:aLevel)
[
theValue := StringWriter new.
Line 1,083:
]
number = theValue get; toReal.
}
 
Line 1,090:
object prop left :: theLeft.
object prop right :: theRight.
objectint rprop level :: theLevel.
 
constructor new(int level:aLevel)
[
theLevel := aLevel.
Line 1,100:
class SummaryNode :: Node
{
constructor new(int level:aLevel)
<= new level(aLevel + 1).
number = theLeft number + theRight number.
Line 1,108:
class DifferenceNode :: Node
{
constructor new(int level:aLevel)
<= new level(aLevel + 1).
number = theLeft number - theRight number.
Line 1,116:
class ProductNode :: Node
{
constructor new(int level:aLevel)
<= new level(aLevel + 2).
number = theLeft number * theRight number.
Line 1,124:
class FractionNode :: Node
{
constructor new(int level:aLevel)
<= new level(aLevel + 2).
number = theLeft number / theRight number.
Line 1,132:
class Expression
{
objectint rprop level :: theLevel.
object prop top :: theTop.
constructor new(int level:aLevel)
[
theLevel := aLevel
Line 1,151:
ch =>
$40 [ // (
^ selftarget newBracket; gotoStarting
];
! [
^ selftarget newToken; append:ch; gotoToken
].
]
Line 1,162:
ch =>
$41 [ // )
^ selftarget closeBracket; gotoToken
];
$42 [ // *
^ selftarget newProduct; gotoOperator
];
$43 [ // +
^ selftarget newSummary; gotoOperator
];
$45 [ // -
^ selftarget newDifference; gotoOperator
];
$47 [ // /
^ selftarget newFraction; gotoOperator
];
! [
^ selftarget append:ch
].
]
Line 1,185:
ch =>
$40 [ // (
^ selftarget newBracket; gotoStarting
];
$45 [ // -
^ selftarget newToken; append literal:"0"; newDifference; gotoOperator
];
! [
^ selftarget newToken; append:ch; gotoToken
].
]
Line 1,198:
{
object theState.
objectint theLevel.
object theParser.
object theToken.
object theExpression.
constructor new parser:aParser
[
theState := startState.
theLevel := 0.
theExpression := Expression new level:(0).
theParser := aParser.
]
Line 1,213:
newToken
[
theToken := theParser appendToken expression:(theExpression, level:theLevel).
]
Line 1,220:
theToken := nil.
theParser appendSummary expression:(theExpression, level:theLevel).
]
Line 1,227:
theToken := nil.
theParser appendDifference expression:(theExpression, level:theLevel)
]
Line 1,234:
theToken := nil.
theParser appendProduct expression:(theExpression, level:theLevel)
]
Line 1,241:
theToken := nil.
theParser appendFraction expression:(theExpression, level:theLevel)
]
 
Line 1,250:
theLevel := theLevel + 10.
theParser appendSubexpression expression:(theExpression, level:theLevel).
]
 
Line 1,268:
]
append (literal: aLiteral)
[
aLiteral forEach(:ch)[ self append:ch ]
Line 1,295:
class Parser
{
appendToken(object expression:anExpression, int level:aLevel)
[
var aToken := Token new level:(aLevel).
anExpression settop top:($= self append last(anExpression top), new:aToken).
^ aToken
]
 
appendSummary(object expression:anExpression, int level:aLevel)
[
anExpression settop := top($self append last(anExpression top), new(SummaryNode new level:(aLevel)).
]
 
appendDifference(object expression:anExpression, int level:aLevel)
[
anExpression settop := top($self append last(anExpression top), new(DifferenceNode new level:(aLevel)).
]
 
appendProduct(object expression:anExpression, int level:aLevel)
[
anExpression settop := top($self append last(anExpression top), new(ProductNode new level:(aLevel)).
]
 
appendFraction(object expression:anExpression, int level:aLevel)
[
anExpression settop := top($self append last(anExpression top), new(FractionNode new level:(aLevel))
]
 
appendSubexpression(object expression:anExpression, int level:aLevel)
[
anExpression settop := top($self append last(anExpression top), new(Expression new level:(aLevel)).
]
 
append(object last:aLastNode, object 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
Line 1,351:
run : aText
[
var aScope := Scope new parser:$(self).
 
aText forEach(:ch)[ aScope eval:ch ].
Line 1,359:
}
 
public program =
[
var aText := StringStringWriter new.
var aParser := Parser new.
 
Anonymous user