示例#1
0
        public LexerErrorListener GetLexerErrors(string src)
        {
            var lexerErrorHandler = new LexerErrorListener();

            var inputStream = new AntlrInputStream(src);
            var lexer       = new WordLangLexer(inputStream);

            lexer.AddErrorListener(lexerErrorHandler);

            var tokenStream = new CommonTokenStream(lexer);
            var tokens      = lexer.GetAllTokens();

            return(lexerErrorHandler);
        }
示例#2
0
        public Tuple <ParserErrorListener, LexerErrorListener> GetParseErrors(string src)
        {
            var lexerErrorHandler = new LexerErrorListener();

            var inputStream = new AntlrInputStream(src);
            var lexer       = new WordLangLexer(inputStream);

            lexer.AddErrorListener(lexerErrorHandler);

            var tokenStream = new CommonTokenStream(lexer);

            var parseErrorHandler = new ParserErrorListener();
            var parser            = new WordLangParser(tokenStream);

            parser.AddErrorListener(parseErrorHandler);

            var ctx = parser.prog();

            return(new Tuple <ParserErrorListener, LexerErrorListener>(parseErrorHandler, lexerErrorHandler));
        }
示例#3
0
        static bool TryExpandMacros(string input, out string output, out IEnumerable <Message> messages)
        {
            var inputStream = CharStreams.fromstring(input);

            var lexer = new GoToLexer(inputStream);
            var lexerErrorListener = new LexerErrorListener();

            lexer.AddErrorListener(lexerErrorListener);
            var expansionMessages = new List <Message>(lexerErrorListener.Messages);

            var tokenStream         = new CommonTokenStream(lexer);
            var parser              = new GoToParser(tokenStream);
            var parserErrorListener = new ParserErrorListener();

            parser.AddErrorListener(parserErrorListener);
            var contextSyntaxTree = parser.program();

            expansionMessages.AddRange(parserErrorListener.Messages);

            var listener = new MacroExpansionListener(tokenStream);

            ParseTreeWalker.Default.Walk(listener, contextSyntaxTree);
            expansionMessages.AddRange(listener.Messages);

            messages = expansionMessages;

            if (AreThereErrors(expansionMessages))
            {
                output = string.Empty;

                return(false);
            }

            var dirtyOutput = listener.RewrittenTokenStream.GetText();

            output = dirtyOutput.TrimStart(Environment.NewLine.ToCharArray());

            return(true);
        }
示例#4
0
        public static IParseTree GenerateAST(string code, ref List <ErrorDescriptor> errors)
        {
            var inputStream = new AntlrInputStream(code);
            var lexer       = new scheme_langLexer(inputStream);

            lexer.RemoveErrorListeners();
            LexerErrorListener errorListener = new LexerErrorListener(errors);

            lexer.AddErrorListener(errorListener);

            var tokenStream = new CommonTokenStream(lexer);
            var parser      = new scheme_langParser(tokenStream);

            parser.RemoveErrorListeners();
            ParserErrorListener errorListener2 = new ParserErrorListener(errors);

            parser.AddErrorListener(errorListener2);

            var context = parser.doc();

            return(context);
        }
示例#5
0
        private void ParseMenuItem_Click(object sender, RoutedEventArgs e)
        {
            // Clear logs
            var logs = Logs.GetInstance();
            logs.Clear();
            LogsListBox.Items.Clear();
            TokensListBox.Items.Clear();

            // Get source code
            _sourceCode = SourceCodeTextEditor.Text;

            _inputStream = new AntlrInputStream(_sourceCode);
            _lexer = new LittleBigCLexer(_inputStream);

            // Lexer error listener
            var lexerErrorListener = new LexerErrorListener();

            _lexer.RemoveErrorListeners();
            _lexer.AddErrorListener(lexerErrorListener);

            // Recognize tokens
            IToken token = _lexer.NextToken();

            while (token.Type != LittleBigCLexer.Eof)
            {
                var vocubalary = LittleBigCLexer.DefaultVocabulary;

                TokensListBox.Items.Add(String.Format("{0} : {1}", token.Text, vocubalary.GetSymbolicName(token.Type)));

                token = _lexer.NextToken();
            }

            _lexer.Reset();

            var tokenStream = new CommonTokenStream(_lexer);
            _parser = new LittleBigCParser(tokenStream);

            // Parser error listener
            var parserErrorListener = new ParserErrorListener();

            _parser.RemoveErrorListeners();
            _parser.AddErrorListener(parserErrorListener);

            // Parser init
            var root = _parser.compilationUnit();

            var treeView = new TreeViewControl(root, _parser);

            TreePanel.Children.Add(treeView);

            // Semantic analyzer
            var _newParser = new LittleBigCParser(tokenStream);

            var semanticAnalyzer = new Semantic(root);

            var scopes = semanticAnalyzer.Scopes;

            ScopesListBox.Items.Clear();

            foreach (var scope in scopes)
            {

                ScopesListBox.Items.Add(String.Format("{0} scope", scope.Name));

                if (scope.ScopeType != ScopeType.Global)
                {
                    ScopesListBox.Items.Add("\tParameter definitions:");

                    if (scope.ParameterDefinitions.Count > 0)
                    {
                        foreach (var parameter in scope.ParameterDefinitions)
                        {
                            ScopesListBox.Items.Add(String.Format("\t\t{0} : {1}", parameter.Key, parameter.Value.VariableType.ToString()));
                        }

                    }
                }

                ScopesListBox.Items.Add("\tVariable definitions:");

                if (scope.VariableDefinitions.Count > 0)
                {
                    foreach (var variable in scope.VariableDefinitions)
                    {
                        ScopesListBox.Items.Add(String.Format("\t\t{0} : {1}", variable.Key, variable.Value.VariableType.ToString()));
                    }
                }

                ScopesListBox.Items.Add("");
            }

            foreach (var error in semanticAnalyzer.Errors)
            {
                LogsListBox.Items.Add(error);
            }

            // Logs
            foreach (var log in logs.LogsCollection)
            {
                LogsListBox.Items.Add(log);
            }

            // Compiler
            if (semanticAnalyzer.Errors.Count == 0 && logs.LogsCollection.Count == 0)
            {
                var name = "HelloWorld";
                var codeGenListener = new CodeGenerationListener(name);

                ParseTreeWalker.Default.Walk(codeGenListener, root);

                if (codeGenListener.Errors.Count != 0)
                {
                    foreach (var error in codeGenListener.Errors)
                    {
                        LogsListBox.Items.Add(error);
                    }
                }
                else
                {
                    var modName = String.Format("{0}.exe", name);

                    Process p = new Process();
                    p.StartInfo.FileName = @"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\ildasm.exe";
                    p.StartInfo.Arguments = "/text /nobar \"" + modName;
                    p.StartInfo.UseShellExecute = false;
                    p.StartInfo.CreateNoWindow = true;
                    p.StartInfo.RedirectStandardOutput = true;
                    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    p.Start();
                    string s = p.StandardOutput.ReadToEnd();
                    p.WaitForExit();
                    p.Close();

                    Process.Start(modName);

                    SourceCodeTextEditor.Text = s;
                }
            }
        }
示例#6
0
        public static bool TryAnalyze(
            string input,
            out string expandedInput,
            out ProgramNode program,
            out IEnumerable <Message> messages)
        {
            program = null;
            var analysisMessages = new List <Message>();

            messages = analysisMessages;

            var isExpansionSucceeded = TryExpandMacros(
                input,
                out string output,
                out IEnumerable <Message> expasionMessages);

            analysisMessages.AddRange(expasionMessages);

            if (isExpansionSucceeded)
            {
                expandedInput = output;
            }
            else
            {
                expandedInput = input;

                return(false);
            }

            var inputStream = CharStreams.fromstring(output);

            var lexer = new GoToLexer(inputStream);
            var lexerErrorListener = new LexerErrorListener();

            lexer.AddErrorListener(lexerErrorListener);
            analysisMessages.AddRange(lexerErrorListener.Messages);

            var tokenStream         = new CommonTokenStream(lexer);
            var parser              = new GoToParser(tokenStream);
            var parserErrorListener = new ParserErrorListener();

            parser.AddErrorListener(parserErrorListener);
            var contextSyntaxTree = parser.program();

            analysisMessages.AddRange(parserErrorListener.Messages);

            var listener = new SemanticListener();

            ParseTreeWalker.Default.Walk(listener, contextSyntaxTree);
            analysisMessages.AddRange(listener.Messages);

            if (AreThereErrors(messages))
            {
                return(false);
            }

            var abstractSyntaxTreeGenerator = new AbstractSyntaxTreeGenerator();

            program = abstractSyntaxTreeGenerator.VisitProgram(contextSyntaxTree) as ProgramNode;

            SemanticAnalyzer.Check(program, ref analysisMessages);

            if (AreThereErrors(messages))
            {
                return(false);
            }

            return(true);
        }