Esempio n. 1
0
        /*************************/

        /*
         *  (* The grammar assumes any amount of whitespaces between each token *)
         *
         *  digit = ? 0-9 ?;
         *  binaryDigit = ? 0-1 ? ;
         *  octalDigit = ? 0-7 ? ;
         *  hexDigit = ? 0-9A-F ? ;
         *  letter = ? a-zA-Z ? ;
         *
         *  identifier = ( "_" | letter ) { "_" | letter | digit } ;
         *  functionName = identifier ;
         *  constant = identifier ;
         *
         *  number = digit { digit } [ "." digit { digit } ] ;
         *  binaryNumber = "0b" binaryNumber { binaryNumber } ;
         *  octalNumber = "0o" octalDigit { octalDigit } ;
         *  hexNumber = "0x" hexDigit { hexDigit } ;
         *
         *  functionArguments = expr { "," expr } ;
         *  functionCall = functionName "(" [ functionArguments ] ")" ;
         *  factorBase = number | "(" expr ")" | functionCall | constant | binaryNumber | octalNumber | hexNumber;
         *  factor = [ "-" | "~" ] factorBase { "^" factor } [ "!" ];
         *  term = factor { ( "*" | "/" | "%" | "&" | "@" | "<<" | ">>" ) factor } ;
         *  expr = term { ( "+" | "-" | "|" )  term } (* | identifier "=" term *) ;
         *
         */

        ParseTreeNode Expr(bool expectParenthesis = false)
        {
            ParseTreeNode node = new ParseTreeNode();

            if (tokens.HasNext())
            {
                node.Left = Term();
            }
            else
            {
                return(null);
            }

            if (tokens.HasNext() && (tokens.PeekForward().TokenType == TokenIdentifier.TokenType.PlussOperator ||
                                     tokens.PeekForward().TokenType == TokenIdentifier.TokenType.MinusOperator ||
                                     tokens.PeekForward().TokenType == TokenIdentifier.TokenType.OrOperator))
            {
                node.Token = tokens.Forward();
                node.Right = Term();

                while (tokens.HasNext() && (tokens.PeekForward().TokenType == TokenIdentifier.TokenType.PlussOperator ||
                                            tokens.PeekForward().TokenType == TokenIdentifier.TokenType.MinusOperator ||
                                            tokens.PeekForward().TokenType == TokenIdentifier.TokenType.OrOperator))
                {
                    ParseTreeNode newNode = new ParseTreeNode();

                    newNode.Token = tokens.Forward();
                    newNode.Left  = node;
                    newNode.Right = Term();
                    node          = newNode;
                }
            }

            if (expectParenthesis && (!tokens.HasNext() || tokens.PeekForward().TokenType != TokenIdentifier.TokenType.RightParenthesis))
            {
                throw new Exception("Syntax error: Expecting ')' at token " + tokens.Position);
            }
            else if (expectParenthesis && tokens.HasNext() && tokens.PeekForward().TokenType == TokenIdentifier.TokenType.RightParenthesis)
            {
                tokens.Forward();
            }

            if (node.Right == null)
            {
                node = node.Left;
            }

            return(node);
        }