Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ProgramNode(
- val procedures: ArrayList<ProcedureNode>
- )
- class ProcedureNode(
- val statementListNode: StatementListNode
- )
- class StatementListNode(
- val statementList: ArrayList<StatementNode>
- )
- open class StatementNode
- class AssignNode(
- val variable: VariableNode,
- val expr: ExpressionNode
- ) : StatementNode()
- class CallNode(
- val procedure: ProcedureNode
- ) : StatementNode()
- class WhileNode(
- val variable: VariableNode,
- val statementList: StatementListNode
- ) : StatementNode()
- class IfNode(
- val variable: VariableNode,
- val thenStatementList: StatementListNode,
- val elseStatementList: StatementListNode
- ) : StatementNode()
- open class ValueNode
- class VariableNode(
- val name: String,
- val value: ExpressionNode = RefExpression(ConstantNode(0))
- ) : ValueNode()
- class ConstantNode(
- val value: Int
- ) : ValueNode()
- abstract class ExpressionNode {
- abstract fun evaluate() : Int
- }
- class PlusExpression(
- val expr0: ExpressionNode,
- val expr1: ExpressionNode
- ) : ExpressionNode() {
- override fun evaluate(): Int {
- return expr0.evaluate() + expr1.evaluate()
- }
- }
- class MinusExpression(
- val expr0: ExpressionNode,
- val expr1: ExpressionNode
- ) : ExpressionNode() {
- override fun evaluate(): Int {
- return expr0.evaluate() + expr1.evaluate()
- }
- }
- class TimesExpression(
- val expr0: ExpressionNode,
- val expr1: ExpressionNode
- ) : ExpressionNode() {
- override fun evaluate(): Int {
- return expr0.evaluate() + expr1.evaluate()
- }
- }
- class RefExpression(
- val ref: ValueNode
- ) : ExpressionNode() {
- override fun evaluate(): Int {
- when (ref) {
- is VariableNode -> return ref.value.evaluate()
- is ConstantNode -> return ref.value
- }
- throw IllegalStateException("Ref expression tried to fetch value of something that is neither Variable or ConstantNode")
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement