ANTLR 语法给出了意想不到的结果
ANTLR grammar is giving unexpected results
这个很简单。我正在通过发明一种可以识别单个单词的语法来学习 ANTLR4。但为什么它不符合我的名字?它正在打印 [ ]
.
我正在使用带有 C# 4.5 的 Antlr 4。
MyFirstGrammar.g4:
grammar MyFirstGrammar;
/*
* Parser Rules
*/
compileUnit
: ID
;
/*
* Lexer Rules
*/
ID : [A-Za-z]+ ;
WS : ' ' -> skip ;
Program.cs
static class Program
{
private static void Main()
{
var stream = new AntlrInputStream("amy");
var lexer = new Grammars.MyFirstGrammarLexer(stream);
var tokens= new CommonTokenStream(lexer);
var parser = new Grammars.MyFirstGrammarParser(tokens);
var root = parser.compileUnit();
Debug.WriteLine(root);
}
}
嗯... 它有效,除了 RuleContext
class 没有在 the way you expect 中定义 ToString
。
ANTLR 生成的 CompileUnitContext
class 扩展了 ParserRuleContext
,扩展了 RuleContext
.
试试这个:
Debug.WriteLine(root.ToStringTree(parser));
它将打印 parse tree:
(compileUnit amy)
或者您可能正在寻找这个:
Debug.WriteLine(root.GetText());
这将按您的预期打印 amy
。 :)
这个很简单。我正在通过发明一种可以识别单个单词的语法来学习 ANTLR4。但为什么它不符合我的名字?它正在打印 [ ]
.
我正在使用带有 C# 4.5 的 Antlr 4。
MyFirstGrammar.g4:
grammar MyFirstGrammar;
/*
* Parser Rules
*/
compileUnit
: ID
;
/*
* Lexer Rules
*/
ID : [A-Za-z]+ ;
WS : ' ' -> skip ;
Program.cs
static class Program
{
private static void Main()
{
var stream = new AntlrInputStream("amy");
var lexer = new Grammars.MyFirstGrammarLexer(stream);
var tokens= new CommonTokenStream(lexer);
var parser = new Grammars.MyFirstGrammarParser(tokens);
var root = parser.compileUnit();
Debug.WriteLine(root);
}
}
嗯... 它有效,除了 RuleContext
class 没有在 the way you expect 中定义 ToString
。
ANTLR 生成的 CompileUnitContext
class 扩展了 ParserRuleContext
,扩展了 RuleContext
.
试试这个:
Debug.WriteLine(root.ToStringTree(parser));
它将打印 parse tree:
(compileUnit amy)
或者您可能正在寻找这个:
Debug.WriteLine(root.GetText());
这将按您的预期打印 amy
。 :)