Antlr 简单语法分析不返回任何语句
使用C#和ANTLR4,我试图解析一个简单的语法,它只是一个简单的assign语句,看起来像: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
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();
}
}
}