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

时间:2019-05-21 11:48:42

标签: 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 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

1 个答案:

答案 0 :(得分:1)

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

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

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