简单语法分析不返回语句

Simple grammar parse returning no statements

使用 C# 和 ANTLR4,我试图解析一个简单的语法,它只是一个简单的赋值语句,看起来像: int someinteger = 3;.

以下是我的解析器规则,其中包含编译单元、块和基本语句。

 //The final compile unit sent to the interpreter.
compileUnit
    : block EOF
    ;

//A block, array of statements.
block: statement*
     ;

//A single statement.
statement: stat_ass;

//An assign statement.
stat_ass: IDENTIFIER IDENTIFIER SET_EQUALS INTEGER ENDLINE;

解析int banana = 142;时,返回的标记为:

[IDENTIFIER, int]
[IDENTIFIER, banana]
[SET_EQUALS, =]
[INTEGER, 142]
[ENDLINE, ;]

然而,当打印我的解析树时,它只包含一个没有语句的 block

ANTLR Parse Tree:
([] [10] <EOF>)

有人能告诉我为什么会失败吗?抱歉,如果这是一个简单的错误,我 运行 没有办法解决这个问题。

Program.cs:

using Antlr4.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace stork
{
    class Program
    {
        static void Main(string[] args)
        {
             //Test input string.
             string input = "int banana = 142;";
             var chars = new AntlrInputStream(input);
             var lexer = new storkLexer(chars);
             var tokens = new CommonTokenStream(lexer);

             //Debug print.
            ANTLRDebug.PrintTokens(lexer);

           //Debug print tree.
           var parser = new storkParser(tokens);
         ANTLRDebug.PrintParseList(parser);

           //Getting tree.
           parser.BuildParseTree = true;
           var tree = parser.compileUnit();
        }
    }
}

ANTLRDebug.cs

https://github.com/c272/stork-lang/blob/master/stork/ANTLRDebug.cs

stork.g4

https://github.com/c272/stork-lang/blob/master/stork/Stork.g4

您的 ANTLRDebug.PrintTokens 方法遍历词法分析器的所有标记,消耗所有标记。之后词法分析器为空(就像迭代器那样),因此您在空令牌流上调用解析器。

您应该在调用 ANTLRDebug.PrintTokens 之后调用 lexer.reset()(或在该方法的末尾调用它)以将词法分析器重置为输入流的开头。

PS:我建议调用 ToStringTree(parser) 而不是 ToStringTree(),因为这样会产生更易读的输出(规则名称而不是数字)。