简单语法分析不返回语句
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()
,因为这样会产生更易读的输出(规则名称而不是数字)。
使用 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()
,因为这样会产生更易读的输出(规则名称而不是数字)。