Antlr 简单语法分析不返回任何语句

Antlr 简单语法分析不返回任何语句,antlr,antlr4,Antlr,Antlr4,使用C#和ANTLR4,我试图解析一个简单的语法,它只是一个简单的assign语句,看起来像: int-someinteger=3 下面是我的解析器规则,其中包含编译单元、块和基本语句 //The final compile unit sent to the interpreter. compileUnit : block EOF ; //A block, array of statements. block: statement* ; //A single st

使用C#和ANTLR4,我试图解析一个简单的语法,它只是一个简单的assign语句,看起来像:
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=142时,返回的令牌为:

[IDENTIFIER, int]
[IDENTIFIER, banana]
[SET_EQUALS, =]
[INTEGER, 142]
[ENDLINE, ;]
但是,当打印我的解析树时,它只包含一个没有语句的

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


您的
ANTLRDebug.PrintTokens
方法迭代lexer中的所有标记,并使用它们。之后,lexer是空的(类似于迭代器),因此您在空令牌流上调用解析器

调用
ANTLRDebug.PrintTokens
(或在该方法末尾调用)后,应调用
lexer.reset()
,将lexer重置为输入流的开头


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

请发布用于生成该输出的代码。我猜您是在空输入流上调用解析器,而不是在输入
intbanana=142上调用解析器。谢谢,我已经添加了用于获取问题树的代码。请发布足够的代码,以便我可以将其放入文件中,编译、运行并获得与您相同的输出。如果您发布了代码的缩短版本(如果您的实际代码有点大,这当然是可取的),请确保缩短版本仍然编译并再现问题。好的,我已经在问题中添加了完整的语法和程序/调试文件。
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();
        }
    }
}