예제 #1
0
        protected internal override void Parse(Lexer lexer, List <ASTree> res)
        {
            Token t = lexer.Read();

            if (t.IsIdentifier)
            {
                foreach (String token in tokens)
                {
                    if (token.Equals(t.Text))
                    {
                        Find(res, t);
                        return;
                    }
                }
            }

            if (tokens.Length > 0)
            {
                throw new ParseException(tokens[0] + " expected.", t);
            }
            else
            {
                throw new ParseException(t);
            }
        }
예제 #2
0
        public void Start()
        {
            var s = File.ReadAllText("in.txt");
            //var s = Console.ReadLine();
            LineNumberReader reader = new LineNumberReader(s);
            Lexer            l      = new Lexer(reader);

            for (Token t; (t = l.Read()) != Token.EOF;)
            {
                Console.WriteLine("=> " + t.Text);
            }
        }
예제 #3
0
        protected internal override void Parse(Lexer lexer, List <ASTree> res)
        {
            Token t = lexer.Read();

            if (Test(t))
            {
                ASTree leaf = factory.Make(t);
                res.Add(leaf);
            }
            else
            {
                throw new ParseException(t);
            }
        }
예제 #4
0
        private ASTree doShift(Lexer lexer, ASTree left, int prec)
        {
            ArrayList <ASTree> list = new ArrayList <ASTree>();

            list.Add(left);
            list.Add(new ASTLeaf(lexer.Read()));
            ASTree     right = factor.Parse(lexer);
            Precedence next;

            while ((next = nextOperator(lexer)) != null &&
                   rightIsExpr(prec, next))
            {
                right = doShift(lexer, right, next.value);
            }

            list.Add(right);
            return(factory.Make(list));
        }