示例#1
0
 private ZealCpuDriver(ICharStream antlrInputStream)
 {
     _lexer       = new ZealCpuLexer(antlrInputStream);
     _tokenStream = new CommonTokenStream(_lexer);
     _parser      = new ZealCpuParser(_tokenStream);
     _parser.RemoveErrorListeners();
     _parser.AddErrorListener(new CpuErrorListener(this));
 }
示例#2
0
 private ZealCpuDriver(ICharStream antlrInputStream)
 {
     _lexer = new ZealCpuLexer(antlrInputStream);
     _tokenStream = new CommonTokenStream(_lexer);
     _parser = new ZealCpuParser(_tokenStream);
     _parser.RemoveErrorListeners();
     _parser.AddErrorListener(new CpuErrorListener(this));
 }
示例#3
0
 private int parseNumberLiteral(ZealCpuParser.NumberLiteralContext context)
 {
     return parseNumberArgument(context).Number;
 }
示例#4
0
        private NumberInstructionArgument parseNumberArgument(ZealCpuParser.NumberLiteralContext context)
        {
            int result = 0;
            ArgumentSize size = ArgumentSize.Byte;

            switch (context.Start.Type)
            {
                case ZealCpuParser.HEX_LITERAL:
                    {
                        string hexText = context.HEX_LITERAL().GetText().Substring(1);
                        if (Int32.TryParse(hexText, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out result))
                        {
                            if (hexText.Length > 4 && hexText.Length <= 6)
                            {
                                size = ArgumentSize.LongWord;
                            }
                            else if (hexText.Length > 2 && hexText.Length <= 4)
                            {
                                size = ArgumentSize.Word;
                            }
                        }
                        break;
                    }
                case ZealCpuParser.INTEGER_LITERAL:
                    if (Int32.TryParse(context.INTEGER_LITERAL().GetText(), out result))
                    {
                        if (result > ushort.MaxValue)
                        {
                            size = ArgumentSize.LongWord;
                        }
                        else if (result > byte.MaxValue)
                        {
                            size = ArgumentSize.Word;
                        }
                    }
                    break;
                case ZealCpuParser.BINARY_LITERAL:
                    {
                        string binaryLiteral = context.BINARY_LITERAL().GetText().Substring(1);
                        int stringLength = binaryLiteral.Length - 1;
                        for (int i = 0; i <= stringLength; ++i)
                        {
                            if (binaryLiteral[stringLength - i] == '1')
                            {
                                result |= (1 << i);
                            }
                        }
                        if (binaryLiteral.Length > 16 && binaryLiteral.Length <= 24)
                        {
                            size = ArgumentSize.LongWord;
                        }
                        else if (binaryLiteral.Length > 8 && binaryLiteral.Length <= 16)
                        {
                            size = ArgumentSize.Word;
                        }
                        break;
                    }
            }

            return new NumberInstructionArgument(result, size);
        }