Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class
- {
- New(fileName)
- {
- .tokenizing = Tokenizing(fileName)
- .space = ""
- .result = ""
- .int = "^[\d]+$"
- .str = "^[\"][\w]"
- .idetifier = "^[^\\d\\W]\\w*\\Z"
- .symbol = "(.*)(\\{|\\}|\\(|\\)|\\[|\\]|\\.|\\,|;|\\+|-|\\*|/|&|\\||<|>|=|~)(.*)"
- }
- addSpace()
- {
- .space $= " "
- }
- subSpace()
- {
- .space = .space.Substr(2)
- }
- WriteClass()
- {
- .tokenizing.Advance()
- .result $= "\n" $ .space $ "<class>"
- .addSpace()
- .writeTag("class","keyword")
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "identifier")
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")// write {
- .tokenizing.Advance()
- while(.tokenizing.Token() is "static" or .tokenizing.Token() is "field"){
- .writeClassVarDec()//ToDo
- .tokenizing.Advance()
- }
- while(.tokenizing.Token() is "constructor"
- or .tokenizing.Token() is "function"
- or.tokenizing.Token() is "method"){
- .writeSubRoutine()//ToDo
- .tokenizing.Advance()
- }
- .writeTag(.tokenizing.Token(), "symbol")// write }
- .subSpace()
- .result $= "\n" $ .space $ "</class>"
- return .result
- }
- writeClassVarDec()
- {
- .result $= "\n" $ .space $ "<classVarDec>"
- .addSpace()
- .writeTag(.tokenizing.Token(),"keyword")// var
- .tokenizing.Advance()
- .isType()
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- while(.tokenizing.Token() is "," )
- {
- .writeTag(.tokenizing.Token(),"symbol")
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- }
- .writeTag(.tokenizing.Token(),"symbol") // write ;
- .subSpace()
- .result $= "\n" $ .space $ "</classVarDec>"
- }
- writeTag(terminal,type)
- {
- if(terminal[0] is '"')
- {
- terminal = terminal.Substr(1,-1)
- terminal = terminal.Replace("_"," ")
- }
- .result $= "\n" $ .space $ "<" $ type $ "> " $ terminal $ " </" $ type $ ">"
- }
- writeSubRoutine()
- {
- .result $= "\n" $ .space $ "<subroutineDec>"
- .addSpace()
- .writeTag(.tokenizing.Token(),"keyword")//ect. method
- .tokenizing.Advance()
- if .tokenizing.Token() is "void"
- .writeTag(.tokenizing.Token(),"keyword")//ect. method
- else
- .isType()
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"symbol") // write (
- .writeParameterList()
- .writeTag(.tokenizing.Token(),"symbol") // write )
- .tokenizing.Advance()
- .writeSubroutineBody()
- .subSpace()
- .result $= "\n" $ .space $ "</subroutineDec>"
- }
- writeParameterList()
- {
- .result $= "\n" $ .space $ "<parameterList>"
- .addSpace()
- .tokenizing.Advance()
- if(.isType())
- {
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- while(.tokenizing.Token() is "," )
- {
- .writeTag(.tokenizing.Token(),"symbol")
- .tokenizing.Advance()
- .isType()
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- }
- }
- .subSpace()
- .result $= "\n" $ .space $ "</parameterList>"
- }
- writeSubroutineBody()
- {
- .result $= "\n" $ .space $ "<subroutineBody>"
- .addSpace()
- .writeTag(.tokenizing.Token(), "symbol")//write {
- .tokenizing.Advance()
- while(.tokenizing.Token() is "var" )
- {
- .writeVarDec()
- .tokenizing.Advance()
- }
- .writeStatements()
- .writeTag(.tokenizing.Token(), "symbol")//write }
- .subSpace()
- .result $= "\n" $ .space $ "</subroutineBody>"
- }
- writeVarDec()
- {
- .result $= "\n" $ .space $ "<varDec>"
- .addSpace()
- .writeTag(.tokenizing.Token(),"keyword")//var
- .tokenizing.Advance()
- .isType()
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- while(.tokenizing.Token() is ",")
- {
- .writeTag(.tokenizing.Token(), "symbol")//write ,
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- }
- .writeTag(.tokenizing.Token(), "symbol")//write ;
- .subSpace()
- .result $= "\n" $ .space $ "</varDec>"
- }
- writeStatements()
- {
- .result $= "\n" $ .space $ "<statements>"
- .addSpace()
- while(.isKeyword(.tokenizing.Token()))
- {
- switch .tokenizing.Token()
- {
- case "if":
- .writeIf()
- .tokenizing.Advance()
- case "let":
- .writeLet()
- .tokenizing.Advance()
- case "while":
- .writeWhile()
- .tokenizing.Advance()
- case "do":
- .writeDo()
- .tokenizing.Advance()
- case "return":
- .writeReturn()
- .tokenizing.Advance()
- }
- }
- .subSpace()
- .result $= "\n" $ .space $ "</statements>"
- }
- writeLet()
- {
- .result $= "\n" $ .space $ "<letStatement>"
- .addSpace()
- .writeTag(.tokenizing.Token(),"keyword")//let
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- if .tokenizing.Token() is "["
- {
- .writeTag(.tokenizing.Token(), "symbol")//write [
- .tokenizing.Advance()
- .writeExpression()//ToDo
- .writeTag(.tokenizing.Token(), "symbol")//write ]
- .tokenizing.Advance()
- }
- .writeTag(.tokenizing.Token(), "symbol")//write =
- .tokenizing.Advance()
- .writeExpression()
- .writeTag(.tokenizing.Token(), "symbol")//write ;
- .subSpace()
- .result $= "\n" $ .space $ "</letStatement>"
- }
- writeIf()
- {
- .result $= "\n" $ .space $ "<ifStatement>"
- .addSpace()
- .writeTag(.tokenizing.Token(),"keyword")//if
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")//write (
- .tokenizing.Advance()
- .writeExpression()
- .writeTag(.tokenizing.Token(), "symbol")//write )
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")//write {
- .tokenizing.Advance()
- .writeStatements()
- .writeTag(.tokenizing.Token(), "symbol")//write }
- .tokenizing.Advance()
- if(.tokenizing.Token() is "else")
- {
- .writeTag(.tokenizing.Token(),"keyword")//else
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")//write {
- .tokenizing.Advance()
- .writeStatements()
- .writeTag(.tokenizing.Token(), "symbol")//write }
- .tokenizing.Advance()
- }
- .subSpace()
- .result $= "\n" $ .space $ "</ifStatement>"
- }
- writeWhile()
- {
- .result $= "\n" $ .space $ "<whileStatement>"
- .addSpace()
- .writeTag(.tokenizing.Token(),"keyword")//while
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")//write (
- .tokenizing.Advance()
- .writeExpression()
- .writeTag(.tokenizing.Token(), "symbol")//write )
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")//write {
- .tokenizing.Advance()
- .writeStatements()
- .writeTag(.tokenizing.Token(), "symbol")//write }
- .subSpace()
- .result $= "\n" $ .space $ "</whileStatement>"
- }
- writeDo()
- {
- .result $= "\n" $ .space $ "<doStatement>"
- .addSpace()
- .writeTag(.tokenizing.Token(),"keyword")//do
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(),"identifier")
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")//write ( or .
- .writeSubRoutineCall()
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")//write ;
- .subSpace()
- .result $= "\n" $ .space $ "</doStatement>"
- }
- writeReturn()
- {
- .result $= "\n" $ .space $ "<returnStatement>"
- .addSpace()
- .writeTag(.tokenizing.Token(),"keyword")//return
- .tokenizing.Advance()
- if(.tokenizing.Token() isnt ";")
- .writeExpression()
- .writeTag(.tokenizing.Token(), "symbol")//write ;
- .subSpace()
- .result $= "\n" $ .space $ "</returnStatement>"
- }
- writeExpression()
- {
- .result $= "\n" $ .space $ "<expression>"
- .addSpace()
- .writeTerminal()
- while(Object("+","-","*","/","&","|","<",">","=").Find(.tokenizing.Token()) isnt false)
- {
- .writeTag(.symbol(.tokenizing.Token()), "symbol")
- .tokenizing.Advance()
- .writeTerminal()
- }
- .subSpace()
- .result $= "\n" $ .space $ "</expression>"
- }
- writeTerminal()
- {
- .result $= "\n" $ .space $ "<term>"
- .addSpace()
- if (.tokenizing.Token() =~ .int ) {
- .writeTag(.tokenizing.Token(), "integerConstant")
- .tokenizing.Advance()
- } else if (.tokenizing.Token() =~ .str) {
- .writeTag(.tokenizing.Token(), "stringConstant")
- .tokenizing.Advance()
- } else if (Object("true","false","null","this").Find(.tokenizing.Token()) isnt false) {
- .writeTag(.tokenizing.Token(),"keyword")
- .tokenizing.Advance()
- } else if (Object("-","~").Find(.tokenizing.Token()) isnt false) {
- .writeTag(.tokenizing.Token(),"symbol")
- .tokenizing.Advance()
- .writeTerminal()
- } else if (.tokenizing.Token() =~ .idetifier) {
- .writeTag(.tokenizing.Token(), "identifier")
- .tokenizing.Advance()
- if (.tokenizing.Token() is "[") {
- .writeTag(.tokenizing.Token(),"symbol")
- .writeArrayTerm()
- .tokenizing.Advance()
- } else if (Object(".","(").Find(.tokenizing.Token()) isnt false) {
- .writeTag(.tokenizing.Token(), "symbol")//write ( or .
- .writeSubRoutineCall()
- .tokenizing.Advance()
- }
- } else if (.tokenizing.Token() =~ .symbol) {
- if (.tokenizing.Token() is "(") {
- .writeTag(.tokenizing.Token(),"symbol")
- .tokenizing.Advance()
- .writeExpression()
- if (.tokenizing.Token() is ")") {
- .writeTag(.tokenizing.Token(),"symbol")
- .tokenizing.Advance()
- }
- }
- }
- .subSpace()
- .result $= "\n" $ .space $ "</term>"
- }
- writeArrayTerm()
- {
- .tokenizing.Advance()
- .writeExpression()
- .writeTag(.tokenizing.Token(), "symbol")//write ]
- }
- writeSubRoutineCall()
- {
- if .tokenizing.Token() is "("
- {
- .tokenizing.Advance()
- .writeExpressionList()
- .writeTag(.tokenizing.Token(), "symbol")//write )
- }
- else
- {
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "identifier")
- .tokenizing.Advance()
- .writeTag(.tokenizing.Token(), "symbol")//write (
- .tokenizing.Advance()
- .writeExpressionList()
- .writeTag(.tokenizing.Token(), "symbol")//write )
- }
- }
- writeExpressionList()
- {
- .result $= "\n" $ .space $ "<expressionList>"
- .addSpace()
- if .tokenizing.Token() isnt ")"
- {
- .writeExpression()
- while .tokenizing.Token() is ","
- {
- .writeTag(.tokenizing.Token(), "symbol")//write (
- .tokenizing.Advance()
- .writeExpression()
- }
- }
- .subSpace()
- .result $= "\n" $ .space $ "</expressionList>"
- }
- isType()
- {
- if (.tokenizing.Token() =~ "^(int|char|boolean)$") {
- .writeTag(.tokenizing.Token(), "keyword")
- return true
- } else if (.tokenizing.Token() =~ .idetifier) {
- .writeTag(.tokenizing.Token(), "identifier")
- return true
- } else {
- return false
- }
- }
- isKeyword(str)
- {
- keywords = #["let","if","do","while","return"]
- for key in keywords
- if str is key
- return true
- return false
- }
- symbol(sym)
- {
- switch sym
- {
- case "<":
- sym = "<"
- case ">":
- sym = ">"
- case "&":
- sym = "&";
- default:
- }
- return sym
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement