我遵循了这里的说明:https://github.com/sharwell/antlr4cs/wiki和http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4
我已经从开头的例子中改变了我的语法,但是它可以使用Java (antlr4.bat和grun.bat),但不能使用由sharwell wiki配置的控制台应用程序。
Java (在只有Hello.g4文件的文件夹中):
antlr4 Hello.g4
javac *.java
grun Hello prog -gui
I then type "hello world" then Return then "^Z" then Return
The gui pops up an matches my grammar correctlyC# (唯一的区别是@解析器和@lexer指令在Java版本中没有使用)
Hello.g4:
grammar MetaMeta;
@parser::members
{
protected const int EOF = Eof;
}
@lexer::members
{
protected const int EOF = Eof;
protected const int HIDDEN = Hidden;
}
prog : stmt NL* EOF;
stmt : hello eos;
hello : HELLO ID;
eos : ';' | NL;
HELLO : 'hello';
ID : [a-z]+;
NL : '\r'? '\n';
WS : [ \t]+ -> skip;Program.cs:
private static void Main(string[] args)
{
(new Program()).Run();
}
public void Run()
{
var text = "hello world\n";
try
{
Console.WriteLine("START");
RunParser(text);
Console.Write("DONE. Hit RETURN to exit: ");
}
catch (Exception ex)
{
Console.WriteLine("ERROR: " + ex);
Console.Write("Hit RETURN to exit: ");
}
Console.ReadLine();
}
private void RunParser(string text)
{
var input = new AntlrInputStream(text);
var lexer = new MetaMetaLexer(input);
var tokens = new CommonTokenStream(lexer);
var parser = new MetaMetaParser(tokens);
var context = parser.prog();
var visitor = new MyVisitor();
visitor.VisitProg(context);
}当运行该程序时,我得到以下信息:
START
HelloVisitor VisitProg
Visit Symbol=<EOF>
DONE. Hit RETURN to exit:我的访问者与cs wiki上的代码示例相同。谢谢你的帮助。)司各特
发布于 2013-10-15 18:47:49
如果你在这里包括你的访问者代码,你会收到一个更快的答案。
您使用的访问者不覆盖AbstractParseTreeVisitor<Result>.VisitTerminal(ITerminalNode)。因此,每次到达终端节点时都会使用该方法的默认实现,该节点只返回DefaultResult() (默认情况下仅为default(Result))。
发布于 2013-10-15 20:01:07
修改后的访问者代码如下:
public class MyVisitor : AbstractParseTreeVisitor<object>
{
public override object VisitTerminal(ITerminalNode node)
{
var text = node.Symbol.Text;
if (text == "\n")
text = @"\n";
Console.WriteLine(" Visit Symbol={0}", text);
return base.VisitTerminal(node);
}
}修改后的调用代码如下:
private void RunParser(string text)
{
var input = new AntlrInputStream(text);
var lexer = new MetaMetaLexer(input);
var tokens = new CommonTokenStream(lexer);
var parser = new MetaMetaParser(tokens);
var context = parser.prog();
var visitor = new MyVisitor();
visitor.Visit(context); //changed to just Visit
}为了完整起见,我添加了这个选项,但我在上面给了Sam正确的答案。
谢谢你,斯科特
https://stackoverflow.com/questions/19366984
复制相似问题