使用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
答案 0 :(得分:1)
您的ANTLRDebug.PrintTokens
方法遍历词法分析器中的所有标记,并消耗掉所有标记。之后,词法分析器为空(这就像迭代器一样),因此您要在空的令牌流上调用解析器。
您应在调用lexer.reset()
(或在该方法的末尾调用)之后调用ANTLRDebug.PrintTokens
,以将词法分析器重置为输入流的开头。
PS:我建议您呼叫ToStringTree(parser)
而不是仅ToStringTree()
,因为那样会产生更易读的输出(规则名称而不是数字)。