示例#1
0
        private void CompileOp(JackTokenizer.ClassifiedJackToken token)
        {
            var sym = token.ParseChar();

            switch (sym)
            {
            case '+':
                this.vm.WriteArithmetic(VMWriter.Command.ADD);
                break;

            case '-':
                this.vm.WriteArithmetic(VMWriter.Command.SUB);
                break;

            case '*':
                this.vm.WriteCall("Math.multiply", 2);
                break;

            case '/':
                this.vm.WriteCall("Math.divide", 2);
                break;

            case '>':
                this.vm.WriteArithmetic(VMWriter.Command.GT);
                break;

            case '<':
                this.vm.WriteArithmetic(VMWriter.Command.LT);
                break;

            case '=':
                this.vm.WriteArithmetic(VMWriter.Command.EQ);
                break;

            case '&':
                this.vm.WriteArithmetic(VMWriter.Command.AND);
                break;

            case '|':
                this.vm.WriteArithmetic(VMWriter.Command.OR);
                break;
            }
        }
示例#2
0
 public static bool ExpectSymbol(this JackTokenizer.ClassifiedJackToken token, char symbol, bool throwException = true)
 {
     if (token.TokenType() == JackTokenizer.JackTokenType.symbol &&
         token.ParseChar() == symbol
         )
     {
         return(true);
     }
     else
     {
         if (throwException)
         {
             throw new Exception("Expected symbol'" + symbol + "' but found '" + token.value + "'.");
         }
         else
         {
             return(false);
         }
     }
 }
示例#3
0
        public static string toXml(this JackTokenizer.ClassifiedJackToken token, SymbolTable symbolTable = null)
        {
            string xml = "";

            JackTokenizer.JackTokenType tokenClass = token.TokenType();
            xml += $"<{tokenClass.ToString()}{token.getIdentifierCategory(symbolTable)}>";
            switch (tokenClass)
            {
            case JackTokenizer.JackTokenType.identifier:
            case JackTokenizer.JackTokenType.intConst:
            case JackTokenizer.JackTokenType.keyword:
                xml += token.value;
                break;

            case JackTokenizer.JackTokenType.stringConst:
                xml += token.ParseStringVal();
                break;

            case JackTokenizer.JackTokenType.symbol:
                char sym = token.ParseChar();
                if (sym == '<')
                {
                    xml += "&lt;";
                }
                else if (sym == '>')
                {
                    xml += "&gt;";
                }
                else if (sym == '&')
                {
                    xml += "&amp;";
                }
                else
                {
                    xml += token.value;
                }
                break;
            }
            xml += "</" + tokenClass.ToString() + ">\n";
            return(xml);
        }
示例#4
0
 public static bool ExpectSymbol(this JackTokenizer.ClassifiedJackToken token, char[] symbols, bool throwException = true)
 {
     if (token.TokenType() == JackTokenizer.JackTokenType.symbol && symbols.Contains(token.ParseChar()))
     {
         return(true);
     }
     else
     {
         if (throwException)
         {
             throw new Exception("Expected on of theses symbols '" + symbols.ToString() + "' but found '" + token.value + "'.");
         }
         else
         {
             return(false);
         }
     }
 }