QL.QLController.BuildAST C# (CSharp) Method

BuildAST() public method

public BuildAST ( string inputString ) : Questionnaire
inputString string
return QL.QLClasses.Questionnaire
        public Questionnaire BuildAST(string inputString)
        {
            MemoryStream inputStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString ?? ""));

            AntlrInputStream antlrInputStream = new AntlrInputStream(inputStream);
            QLLexer lexer = new QLLexer(antlrInputStream);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            _parser = new QLParser(tokens);

            //Replaxe lexer/parser error listeners
            lexer.RemoveErrorListeners();
            _parser.RemoveErrorListeners();
            lexer.AddErrorListener(new LexerErrorListener() { OnError = LexerErrors.Add });
            _parser.AddErrorListener(new ParserErrorListener() { OnError = ParserErrors.Add });

            //set manager on partial parser class
            _parser.SetIdManager(Memory);

            //build AST
            _parseTree = _parser.questionnaire();
            AST = _parser.GetAST();

            //check for lexer/parser errors
            if (!LexerErrors.Any() && !ParserErrors.Any())
            {
                TypeChecker.Run(AST);
            }

            return AST;
        }

Usage Example

        private void btnParse_Click(object sender, EventArgs e)
        {
            txtMessages.Clear();
            pnlErrors.Controls.Clear();

            _qlController = new QLController();
            _errorYPos = 0;

            //build AST + check types
            _qlController.BuildAST(txtInput.Text);

            foreach (string lexerError in _qlController.LexerErrors)
                WriteMessage(lexerError);

            if(_qlController.LexerErrors.Any())
                WriteErrorLabel("Lexer errors occurred, see messages");

            foreach (string parserError in _qlController.ParserErrors)
                WriteMessage(parserError);

            if(_qlController.ParserErrors.Any())
                WriteErrorLabel("Parser errors occurred, see messages");

            //get type errors
            QLTypeChecker typeChecker = _qlController.TypeChecker;
            foreach (QLTypeError typeError in typeChecker.TypeErrors.OrderBy((te) => te.IsWarning))
            {
                string error = string.Format("{5} QLTypeChecker: {0} {1}" +
                                             "<At token '{2}' on line {3}, column {4}>",
                    typeError.Message, Environment.NewLine,
                    typeError.TokenInfo.TokenText,
                    typeError.TokenInfo.TokenLine,
                    typeError.TokenInfo.TokenColumn,
                    typeError.IsWarning ? "(Warning)" : "(Error)");

                WriteErrorLabel(error, typeError.IsWarning);
            }

            WriteMessage(string.Format(@"Generated parse tree:
                                              {0} {1}"
                    , Environment.NewLine
                    , _qlController.GetParseTreeString()));

            //check if generate is possible
            if (_qlController.LexerErrors.Any() || _qlController.ParserErrors.Any() || typeChecker.TypeErrors.Any((te) => !te.IsWarning))
                lblSuccess.Visible = btnGenerate.Enabled = false;
            else
                lblSuccess.Visible = btnGenerate.Enabled = true;
        }
All Usage Examples Of QL.QLController::BuildAST