[10] Finishes compiler implementation
This commit is contained in:
parent
812c76e09a
commit
b0aa03980c
|
@ -77,9 +77,16 @@ class Engine:
|
||||||
self.write(line, end="")
|
self.write(line, end="")
|
||||||
|
|
||||||
self.advance()
|
self.advance()
|
||||||
for e in grammar:
|
|
||||||
self.compile(e)
|
|
||||||
|
|
||||||
|
print(lookup_keys)
|
||||||
|
print("grammar inside matchDict ")
|
||||||
|
print(grammar)
|
||||||
|
|
||||||
|
# Grammar can be none
|
||||||
|
if grammar:
|
||||||
|
self.compile(grammar)
|
||||||
|
|
||||||
|
# TODO: Improve open and close for dicts
|
||||||
if isinstance(el, Element):
|
if isinstance(el, Element):
|
||||||
self.close(el)
|
self.close(el)
|
||||||
|
|
||||||
|
@ -109,7 +116,7 @@ class Engine:
|
||||||
self.advance()
|
self.advance()
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
# print("%s != %s" % (current, expected))
|
print("%s != %s" % (current, expected))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def open(self, el):
|
def open(self, el):
|
||||||
|
@ -124,29 +131,37 @@ class Engine:
|
||||||
If you set matchOnly = true, the cursor will not move forward
|
If you set matchOnly = true, the cursor will not move forward
|
||||||
If it is forced to move forward (LL1 grammar for eg,) it will raise an error instead
|
If it is forced to move forward (LL1 grammar for eg,) it will raise an error instead
|
||||||
"""
|
"""
|
||||||
def compile(self, thing, matchOnly = False):
|
def compile(self, grammar, matchOnly = False):
|
||||||
if isinstance(thing, Element):
|
if callable(grammar):
|
||||||
ret = self.compile(thing.grammar[0], True)
|
ret = self.compile(grammar(), matchOnly)
|
||||||
if (matchOnly == False and ret) or thing.empty:
|
elif isinstance(grammar, Element):
|
||||||
self.open(thing)
|
ret = self.compile(grammar.grammar, True)
|
||||||
for e in thing.grammar:
|
|
||||||
ret = self.compile(e)
|
|
||||||
self.close(thing)
|
|
||||||
return ret
|
|
||||||
elif callable(thing):
|
|
||||||
grammar = thing()
|
|
||||||
return self.compile(grammar, matchOnly)
|
|
||||||
else:
|
|
||||||
grammar = thing
|
|
||||||
grammarType = type(grammar)
|
|
||||||
|
|
||||||
if grammarType == list:
|
if grammar.name == 'term':
|
||||||
return self.ZeroOrMany(grammar, matchOnly)
|
print(ret)
|
||||||
elif grammarType == dict:
|
print(self.atom())
|
||||||
return self.MatchDict(grammar, matchOnly)
|
|
||||||
elif grammarType == tuple:
|
if (matchOnly == False and ret) or grammar.empty:
|
||||||
return self.ZeroOrOne(grammar, matchOnly)
|
self.open(grammar)
|
||||||
elif grammarType == Atom:
|
# Avoid useless compilation
|
||||||
return self.MatchAtom(grammar, matchOnly)
|
if ret:
|
||||||
|
ret = self.compile(grammar.grammar)
|
||||||
|
self.close(grammar)
|
||||||
|
elif isinstance(grammar, Sequence):
|
||||||
|
if matchOnly:
|
||||||
|
ret = self.compile(grammar[0], True)
|
||||||
else:
|
else:
|
||||||
raise Exception("Should not have reached here")
|
for e in grammar:
|
||||||
|
ret = self.compile(e)
|
||||||
|
elif isinstance(grammar, list):
|
||||||
|
ret = self.ZeroOrMany(grammar, matchOnly)
|
||||||
|
elif isinstance(grammar,dict):
|
||||||
|
ret = self.MatchDict(grammar, matchOnly)
|
||||||
|
elif isinstance(grammar,tuple):
|
||||||
|
ret = self.ZeroOrOne(grammar, matchOnly)
|
||||||
|
elif isinstance(grammar,Atom):
|
||||||
|
ret = self.MatchAtom(grammar, matchOnly)
|
||||||
|
else:
|
||||||
|
raise Exception("Invalid Grammar")
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
|
@ -20,73 +20,109 @@ This is basically an attempt to translate Figure 10.5 from the book into
|
||||||
a Python structure.
|
a Python structure.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
class Sequence(list):
|
||||||
|
def first(self):
|
||||||
|
return self[0]
|
||||||
|
|
||||||
class Element:
|
class Element:
|
||||||
# Usually I avoid inverted boolean variable names, but this is much cleaner
|
# Usually I avoid inverted boolean variable names, but this is much cleaner
|
||||||
def __init__(self, name, grammar):
|
def __init__(self, name, grammar):
|
||||||
assert(type(grammar)==list)
|
# Since Any derives from list, this ought to work
|
||||||
|
assert(isinstance(grammar, list) or isinstance(grammar, dict))
|
||||||
self.name = name
|
self.name = name
|
||||||
self.grammar = grammar
|
self.grammar = grammar
|
||||||
self.empty = False
|
self.empty = False
|
||||||
|
|
||||||
|
def first(self):
|
||||||
|
if isinstance(self.grammar, list):
|
||||||
|
return self.grammar[0]
|
||||||
|
elif isinstance(self.grammar, dict):
|
||||||
|
return list(self.grammar.keys())[0]
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
CLASSVARDEC = Element('classVarDec', [
|
CLASSVARDEC = Element('classVarDec', Sequence([
|
||||||
# static|field type (, name)* ;
|
# static|field type (, name)* ;
|
||||||
Atom.STATIC | Atom.FIELD,
|
Atom.STATIC | Atom.FIELD,
|
||||||
Atom.INT | Atom.CHAR | Atom.BOOLEAN | Atom.IDENTIFIER,
|
Atom.INT | Atom.CHAR | Atom.BOOLEAN | Atom.IDENTIFIER,
|
||||||
Atom.IDENTIFIER,
|
Atom.IDENTIFIER,
|
||||||
|
# Zero or one of these
|
||||||
[Atom.COMMA, Atom.IDENTIFIER],
|
[Atom.COMMA, Atom.IDENTIFIER],
|
||||||
Atom.SEMICOLON
|
Atom.SEMICOLON
|
||||||
])
|
]))
|
||||||
|
|
||||||
VARDEC = Element('varDec', [Atom.VAR, Atom.INT | Atom.CHAR | Atom.BOOLEAN | Atom.IDENTIFIER, Atom.IDENTIFIER,
|
VARDEC = Element('varDec', Sequence([
|
||||||
|
Atom.VAR, Atom.INT | Atom.CHAR | Atom.BOOLEAN | Atom.IDENTIFIER, Atom.IDENTIFIER,
|
||||||
|
# Zero or one of these
|
||||||
[Atom.COMMA, Atom.IDENTIFIER],
|
[Atom.COMMA, Atom.IDENTIFIER],
|
||||||
Atom.SEMICOLON
|
Atom.SEMICOLON
|
||||||
])
|
]))
|
||||||
|
|
||||||
# Since this is not a non-terminal, we can just write it as a constant
|
# Since these are not a non-terminal, we can just write it as a constant
|
||||||
OP = Atom.PLUS | Atom.MINUS | Atom.MUL | Atom.DIV | Atom.AND | Atom.OR | Atom.GT | Atom.LT | Atom.EQ
|
OP = Atom.PLUS | Atom.MINUS | Atom.MUL | Atom.DIV | Atom.AND | Atom.OR | Atom.GT | Atom.LT | Atom.EQ
|
||||||
UNARY_OP = Atom.NOT | Atom.MINUS
|
UNARY_OP = Atom.NOT | Atom.MINUS
|
||||||
CONSTANT = Atom.TRUE | Atom.FALSE|Atom.NULL|Atom.THIS
|
CONSTANT = Atom.TRUE | Atom.FALSE | Atom.NULL | Atom.THIS
|
||||||
""" Pseudo-element to help define subroutine declarations """
|
""" Pseudo-element to help define subroutine declarations """
|
||||||
RETURN_TYPES= Atom.INT | Atom.CHAR|Atom.BOOLEAN|Atom.IDENTIFIER|Atom.VOID
|
RETURN_TYPES= Atom.INT | Atom.CHAR | Atom.BOOLEAN | Atom.IDENTIFIER | Atom.VOID
|
||||||
|
|
||||||
# TODO: This is missing the following:
|
# This is a flattened version of the Term structure
|
||||||
# var [expression]
|
TERM = Element('term', {
|
||||||
# subRoutineCall
|
(Atom.INTEGERCONSTANT,): None,
|
||||||
# (expressions in parenthes)
|
(Atom.STRINGCONSTANT,): None,
|
||||||
# unaryOP TERM
|
(Atom.TRUE,): None,
|
||||||
TERM = Element('term', [
|
(Atom.FALSE,): None,
|
||||||
Atom.INTEGERCONSTANT | Atom.STRINGCONSTANT | Atom.TRUE | Atom.FALSE | Atom.NULL| Atom.THIS | Atom.IDENTIFIER
|
(Atom.NULL,): None,
|
||||||
])
|
(Atom.THIS,): None,
|
||||||
|
# unaryOp TERM
|
||||||
|
(Atom.NOT,): Sequence([lambda: TERM]),
|
||||||
|
(Atom.MINUS,): Sequence([lambda: TERM]),
|
||||||
|
# (expression)
|
||||||
|
(Atom.PAREN_OPEN,): Sequence([lambda: EXPRESSION, Atom.PAREN_CLOSE]),
|
||||||
|
(Atom.IDENTIFIER,): {
|
||||||
|
# array lookup
|
||||||
|
(Atom.SQUARE_OPEN,): Sequence([lambda: EXPRESSION, Atom.SQUARE_CLOSE]),
|
||||||
|
# Subroutine call, but with class name
|
||||||
|
(Atom.DOT,): Sequence([
|
||||||
|
Atom.IDENTIFIER,
|
||||||
|
Atom.PAREN_OPEN,
|
||||||
|
lambda: EXPRESSIONLIST,
|
||||||
|
Atom.PAREN_CLOSE
|
||||||
|
]),
|
||||||
|
# Subroutine call, but to same class
|
||||||
|
(Atom.PAREN_OPEN,): Sequence([
|
||||||
|
lambda: EXPRESSIONLIST,
|
||||||
|
Atom.PAREN_CLOSE
|
||||||
|
])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
EXPRESSION = Element('expression', [TERM, [OP, TERM]])
|
EXPRESSION = Element('expression', Sequence([TERM, [OP, TERM]]))
|
||||||
|
|
||||||
EXPRESSIONLIST = Element('expressionList', [(EXPRESSION, [Atom.COMMA, EXPRESSION])])
|
EXPRESSIONLIST = Element('expressionList', Sequence([
|
||||||
|
(EXPRESSION, [Atom.COMMA, EXPRESSION])
|
||||||
|
]))
|
||||||
|
|
||||||
DO_STATEMENT = Element('doStatement', [{
|
SUBROUTINE_CALL = [
|
||||||
(Atom.IDENTIFIER, Atom.PAREN_OPEN): [
|
(Atom.IDENTIFIER, Atom.DOT),
|
||||||
EXPRESSIONLIST,
|
Atom.IDENTIFIER,
|
||||||
Atom.PAREN_CLOSE,
|
Atom.PAREN_OPEN,
|
||||||
],
|
EXPRESSIONLIST,
|
||||||
(Atom.IDENTIFIER, Atom.DOT): [
|
Atom.PAREN_CLOSE
|
||||||
Atom.IDENTIFIER,
|
]
|
||||||
Atom.PAREN_OPEN,
|
|
||||||
EXPRESSIONLIST,
|
|
||||||
Atom.PAREN_CLOSE
|
|
||||||
]
|
|
||||||
},Atom.SEMICOLON])
|
|
||||||
|
|
||||||
LET_STATEMENT = Element('letStatement', [
|
DO_STATEMENT = Element('doStatement', Sequence([SUBROUTINE_CALL,Atom.SEMICOLON]))
|
||||||
|
|
||||||
|
LET_STATEMENT = Element('letStatement', Sequence([
|
||||||
Atom.IDENTIFIER,
|
Atom.IDENTIFIER,
|
||||||
(Atom.SQUARE_OPEN, EXPRESSION, Atom.SQUARE_CLOSE),
|
(Atom.SQUARE_OPEN, EXPRESSION, Atom.SQUARE_CLOSE),
|
||||||
Atom.EQ,
|
Atom.EQ,
|
||||||
EXPRESSION,
|
EXPRESSION,
|
||||||
Atom.SEMICOLON
|
Atom.SEMICOLON
|
||||||
])
|
]))
|
||||||
|
|
||||||
IF_STATEMENT = Element('ifStatement', [
|
IF_STATEMENT = Element('ifStatement', Sequence([
|
||||||
Atom.PAREN_OPEN,
|
Atom.PAREN_OPEN,
|
||||||
EXPRESSION,
|
EXPRESSION,
|
||||||
Atom.PAREN_CLOSE,
|
Atom.PAREN_CLOSE,
|
||||||
|
@ -95,18 +131,20 @@ IF_STATEMENT = Element('ifStatement', [
|
||||||
Atom.BRACE_CLOSE,
|
Atom.BRACE_CLOSE,
|
||||||
# This is the tricky one
|
# This is the tricky one
|
||||||
( Atom.ELSE, Atom.BRACE_OPEN, lambda:STATEMENTS, Atom.BRACE_CLOSE)
|
( Atom.ELSE, Atom.BRACE_OPEN, lambda:STATEMENTS, Atom.BRACE_CLOSE)
|
||||||
])
|
]))
|
||||||
|
|
||||||
WHILE_STATEMENT = Element('whileStatement', [
|
WHILE_STATEMENT = Element('whileStatement', Sequence([
|
||||||
Atom.PAREN_OPEN,
|
Atom.PAREN_OPEN,
|
||||||
EXPRESSION,
|
EXPRESSION,
|
||||||
Atom.PAREN_CLOSE,
|
Atom.PAREN_CLOSE,
|
||||||
Atom.BRACE_OPEN,
|
Atom.BRACE_OPEN,
|
||||||
lambda: STATEMENTS,
|
lambda: STATEMENTS,
|
||||||
Atom.BRACE_CLOSE,
|
Atom.BRACE_CLOSE,
|
||||||
])
|
]))
|
||||||
|
|
||||||
RETURN_STATEMENT = Element('returnStatement', [(EXPRESSION), Atom.SEMICOLON])
|
RETURN_STATEMENT = Element('returnStatement', Sequence([
|
||||||
|
(EXPRESSION), Atom.SEMICOLON
|
||||||
|
]))
|
||||||
|
|
||||||
# Just a constant, since this isn't a non-terminal
|
# Just a constant, since this isn't a non-terminal
|
||||||
STATEMENT = {
|
STATEMENT = {
|
||||||
|
@ -117,31 +155,32 @@ STATEMENT = {
|
||||||
(Atom.RETURN,): RETURN_STATEMENT
|
(Atom.RETURN,): RETURN_STATEMENT
|
||||||
}
|
}
|
||||||
|
|
||||||
STATEMENTS = Element('statements', [[STATEMENT]])
|
STATEMENTS = Element('statements', Sequence([[STATEMENT]]))
|
||||||
|
|
||||||
SUBROUTINE_BODY = Element('subroutineBody', [
|
SUBROUTINE_BODY = Element('subroutineBody', Sequence([
|
||||||
# One or more variable declarations
|
# One or more variable declarations
|
||||||
# `var type varName (, varName)* ;`
|
# `var type varName (, varName)* ;`
|
||||||
Atom.BRACE_OPEN,
|
Atom.BRACE_OPEN,
|
||||||
[VARDEC],
|
[VARDEC],
|
||||||
STATEMENTS,
|
STATEMENTS,
|
||||||
Atom.BRACE_CLOSE
|
Atom.BRACE_CLOSE
|
||||||
])
|
]))
|
||||||
|
|
||||||
# Parameter List =
|
# Parameter List =
|
||||||
# (
|
# (
|
||||||
# (type varName) (, type varName)*
|
# (type varName) (, type varName)*
|
||||||
# )?
|
# )?
|
||||||
# we use tuples for zero OR one of a sequence
|
# we use tuples for zero OR one of a sequence
|
||||||
PARAMETER_LIST = Element('parameterList', [(
|
PARAMETER_LIST = Element('parameterList', Sequence([(
|
||||||
Atom.INT | Atom.CHAR | Atom.BOOLEAN | Atom.IDENTIFIER,
|
Atom.INT | Atom.CHAR | Atom.BOOLEAN | Atom.IDENTIFIER,
|
||||||
Atom.IDENTIFIER,
|
Atom.IDENTIFIER,
|
||||||
|
# Zero or one of the following:
|
||||||
[Atom.COMMA, Atom.INT | Atom.CHAR|Atom.BOOLEAN|Atom.IDENTIFIER, Atom.IDENTIFIER]
|
[Atom.COMMA, Atom.INT | Atom.CHAR|Atom.BOOLEAN|Atom.IDENTIFIER, Atom.IDENTIFIER]
|
||||||
)])
|
)]))
|
||||||
|
|
||||||
EXPRESSIONLIST.empty = PARAMETER_LIST.empty = True
|
EXPRESSIONLIST.empty = PARAMETER_LIST.empty = True
|
||||||
|
|
||||||
SUBROUTINEDEC = Element('subroutineDec', [
|
SUBROUTINEDEC = Element('subroutineDec', Sequence([
|
||||||
# (constructor | function | method) (void | type) subRoutineName '(' parameterList ')'
|
# (constructor | function | method) (void | type) subRoutineName '(' parameterList ')'
|
||||||
# subroutineBody
|
# subroutineBody
|
||||||
Atom.CONSTRUCTOR | Atom.FUNCTION | Atom.METHOD,
|
Atom.CONSTRUCTOR | Atom.FUNCTION | Atom.METHOD,
|
||||||
|
@ -151,13 +190,13 @@ SUBROUTINEDEC = Element('subroutineDec', [
|
||||||
PARAMETER_LIST,
|
PARAMETER_LIST,
|
||||||
Atom.PAREN_CLOSE,
|
Atom.PAREN_CLOSE,
|
||||||
SUBROUTINE_BODY,
|
SUBROUTINE_BODY,
|
||||||
])
|
]))
|
||||||
|
|
||||||
CLASS = Element('class', [
|
CLASS = Element('class', Sequence([
|
||||||
Atom.CLASS,
|
Atom.CLASS,
|
||||||
Atom.IDENTIFIER,
|
Atom.IDENTIFIER,
|
||||||
Atom.BRACE_OPEN,
|
Atom.BRACE_OPEN,
|
||||||
[CLASSVARDEC],
|
[CLASSVARDEC],
|
||||||
[SUBROUTINEDEC],
|
[SUBROUTINEDEC],
|
||||||
Atom.BRACE_CLOSE
|
Atom.BRACE_CLOSE
|
||||||
])
|
]))
|
||||||
|
|
|
@ -0,0 +1,286 @@
|
||||||
|
<class>
|
||||||
|
<keyword> class </keyword>
|
||||||
|
<identifier> Main </identifier>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<subroutineDec>
|
||||||
|
<keyword> function </keyword>
|
||||||
|
<keyword> void </keyword>
|
||||||
|
<identifier> main </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<parameterList>
|
||||||
|
</parameterList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<subroutineBody>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<identifier> Array </identifier>
|
||||||
|
<identifier> a </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<keyword> int </keyword>
|
||||||
|
<identifier> length </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<keyword> int </keyword>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
<symbol> , </symbol>
|
||||||
|
<identifier> sum </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> length </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> Keyboard </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> readInt </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<stringconstant> HOW MANY NUMBERS? </stringconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> a </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> Array </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> new </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> length </identifier>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 0 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<whileStatement>
|
||||||
|
<keyword> while </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> < </symbol>
|
||||||
|
<term>
|
||||||
|
<identifier> length </identifier>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> a </identifier>
|
||||||
|
<symbol> [ </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ] </symbol>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> Keyboard </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> readInt </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<stringconstant> ENTER THE NEXT NUMBER: </stringconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> + </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 1 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</whileStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 0 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> sum </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 0 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<whileStatement>
|
||||||
|
<keyword> while </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> < </symbol>
|
||||||
|
<term>
|
||||||
|
<identifier> length </identifier>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> sum </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> sum </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> + </symbol>
|
||||||
|
<term>
|
||||||
|
<identifier> a </identifier>
|
||||||
|
<symbol> [ </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ] </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> + </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 1 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</whileStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> Output </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> printString </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<stringconstant> THE AVERAGE IS: </stringconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> Output </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> printInt </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> sum </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> / </symbol>
|
||||||
|
<term>
|
||||||
|
<identifier> length </identifier>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> Output </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> println </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
<returnStatement>
|
||||||
|
<keyword> return </keyword>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</returnStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</subroutineBody>
|
||||||
|
</subroutineDec>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</class>
|
|
@ -0,0 +1,244 @@
|
||||||
|
<class>
|
||||||
|
<keyword> class </keyword>
|
||||||
|
<identifier> Main </identifier>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<classVarDec>
|
||||||
|
<keyword> static </keyword>
|
||||||
|
<keyword> boolean </keyword>
|
||||||
|
<identifier> test </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</classVarDec>
|
||||||
|
<subroutineDec>
|
||||||
|
<keyword> function </keyword>
|
||||||
|
<keyword> void </keyword>
|
||||||
|
<identifier> main </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<parameterList>
|
||||||
|
</parameterList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<subroutineBody>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<identifier> SquareGame </identifier>
|
||||||
|
<identifier> game </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> game </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> SquareGame </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> new </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> game </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> run </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> game </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> dispose </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
<returnStatement>
|
||||||
|
<keyword> return </keyword>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</returnStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</subroutineBody>
|
||||||
|
</subroutineDec>
|
||||||
|
<subroutineDec>
|
||||||
|
<keyword> function </keyword>
|
||||||
|
<keyword> void </keyword>
|
||||||
|
<identifier> test </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<parameterList>
|
||||||
|
</parameterList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<subroutineBody>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<keyword> int </keyword>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
<symbol> , </symbol>
|
||||||
|
<identifier> j </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<identifier> String </identifier>
|
||||||
|
<identifier> s </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<identifier> Array </identifier>
|
||||||
|
<identifier> a </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<statements>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<keyword> false </keyword>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> s </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<stringconstant> string constant </stringconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> s </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<keyword> null </keyword>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> a </identifier>
|
||||||
|
<symbol> [ </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 1 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ] </symbol>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> a </identifier>
|
||||||
|
<symbol> [ </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 2 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ] </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
<keyword> else </keyword>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> * </symbol>
|
||||||
|
<term>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<symbol> - </symbol>
|
||||||
|
<term>
|
||||||
|
<identifier> j </identifier>
|
||||||
|
</term>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> j </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> j </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> / </symbol>
|
||||||
|
<term>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<symbol> - </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 2 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> i </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> | </symbol>
|
||||||
|
<term>
|
||||||
|
<identifier> j </identifier>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<returnStatement>
|
||||||
|
<keyword> return </keyword>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</returnStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</subroutineBody>
|
||||||
|
</subroutineDec>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</class>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,643 @@
|
||||||
|
<class>
|
||||||
|
<keyword> class </keyword>
|
||||||
|
<identifier> SquareGame </identifier>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<classVarDec>
|
||||||
|
<keyword> field </keyword>
|
||||||
|
<identifier> Square </identifier>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</classVarDec>
|
||||||
|
<classVarDec>
|
||||||
|
<keyword> field </keyword>
|
||||||
|
<keyword> int </keyword>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</classVarDec>
|
||||||
|
<subroutineDec>
|
||||||
|
<keyword> constructor </keyword>
|
||||||
|
<identifier> SquareGame </identifier>
|
||||||
|
<identifier> new </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<parameterList>
|
||||||
|
</parameterList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<subroutineBody>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> Square </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> new </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 0 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> , </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 0 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> , </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 30 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 0 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<returnStatement>
|
||||||
|
<keyword> return </keyword>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<keyword> this </keyword>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</returnStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</subroutineBody>
|
||||||
|
</subroutineDec>
|
||||||
|
<subroutineDec>
|
||||||
|
<keyword> method </keyword>
|
||||||
|
<keyword> void </keyword>
|
||||||
|
<identifier> dispose </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<parameterList>
|
||||||
|
</parameterList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<subroutineBody>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> dispose </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> Memory </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> deAlloc </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<keyword> this </keyword>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
<returnStatement>
|
||||||
|
<keyword> return </keyword>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</returnStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</subroutineBody>
|
||||||
|
</subroutineDec>
|
||||||
|
<subroutineDec>
|
||||||
|
<keyword> method </keyword>
|
||||||
|
<keyword> void </keyword>
|
||||||
|
<identifier> moveSquare </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<parameterList>
|
||||||
|
</parameterList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<subroutineBody>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 1 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> moveUp </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 2 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> moveDown </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 3 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> moveLeft </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 4 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> moveRight </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> Sys </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> wait </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 5 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
<returnStatement>
|
||||||
|
<keyword> return </keyword>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</returnStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</subroutineBody>
|
||||||
|
</subroutineDec>
|
||||||
|
<subroutineDec>
|
||||||
|
<keyword> method </keyword>
|
||||||
|
<keyword> void </keyword>
|
||||||
|
<identifier> run </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<parameterList>
|
||||||
|
</parameterList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<subroutineBody>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<keyword> char </keyword>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<varDec>
|
||||||
|
<keyword> var </keyword>
|
||||||
|
<keyword> boolean </keyword>
|
||||||
|
<identifier> exit </identifier>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</varDec>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> exit </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<keyword> false </keyword>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<whileStatement>
|
||||||
|
<keyword> while </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<symbol> ~ </symbol>
|
||||||
|
<term>
|
||||||
|
<identifier> exit </identifier>
|
||||||
|
</term>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<whileStatement>
|
||||||
|
<keyword> while </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 0 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> Keyboard </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> keyPressed </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> moveSquare </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</whileStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 81 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> exit </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<keyword> true </keyword>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 90 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> decSize </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 88 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> square </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> incSize </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 131 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 1 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 133 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 2 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 130 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 3 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<ifStatement>
|
||||||
|
<keyword> if </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 132 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> direction </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 4 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</ifStatement>
|
||||||
|
<whileStatement>
|
||||||
|
<keyword> while </keyword>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<symbol> ~ </symbol>
|
||||||
|
<term>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
</term>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<term>
|
||||||
|
<integerconstant> 0 </integerconstant>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> { </symbol>
|
||||||
|
<statements>
|
||||||
|
<letStatement>
|
||||||
|
<keyword> let </keyword>
|
||||||
|
<identifier> key </identifier>
|
||||||
|
<symbol> = </symbol>
|
||||||
|
<expression>
|
||||||
|
<term>
|
||||||
|
<identifier> Keyboard </identifier>
|
||||||
|
<symbol> . </symbol>
|
||||||
|
<identifier> keyPressed </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
</term>
|
||||||
|
</expression>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</letStatement>
|
||||||
|
<doStatement>
|
||||||
|
<keyword> do </keyword>
|
||||||
|
<identifier> moveSquare </identifier>
|
||||||
|
<symbol> ( </symbol>
|
||||||
|
<expressionList>
|
||||||
|
</expressionList>
|
||||||
|
<symbol> ) </symbol>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</doStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</whileStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</whileStatement>
|
||||||
|
<returnStatement>
|
||||||
|
<keyword> return </keyword>
|
||||||
|
<symbol> ; </symbol>
|
||||||
|
</returnStatement>
|
||||||
|
</statements>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</subroutineBody>
|
||||||
|
</subroutineDec>
|
||||||
|
<symbol> } </symbol>
|
||||||
|
</class>
|
Loading…
Reference in New Issue