首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr4cs:相同语法、不同结果与Java工具

Antlr4cs:相同语法、不同结果与Java工具
EN

Stack Overflow用户
提问于 2013-10-14 18:42:44
回答 2查看 369关注 0票数 0

我遵循了这里的说明:https://github.com/sharwell/antlr4cs/wikihttp://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4

我已经从开头的例子中改变了我的语法,但是它可以使用Java (antlr4.bat和grun.bat),但不能使用由sharwell wiki配置的控制台应用程序。

Java (在只有Hello.g4文件的文件夹中):

代码语言:javascript
复制
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 correctly

C# (唯一的区别是@解析器和@lexer指令在Java版本中没有使用)

Hello.g4:

代码语言:javascript
复制
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:

代码语言:javascript
复制
    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);
    }

当运行该程序时,我得到以下信息:

代码语言:javascript
复制
START
HelloVisitor VisitProg
 Visit Symbol=<EOF>
DONE. Hit RETURN to exit:

我的访问者与cs wiki上的代码示例相同。谢谢你的帮助。)司各特

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-15 18:47:49

如果你在这里包括你的访问者代码,你会收到一个更快的答案。

您使用的访问者不覆盖AbstractParseTreeVisitor<Result>.VisitTerminal(ITerminalNode)。因此,每次到达终端节点时都会使用该方法的默认实现,该节点只返回DefaultResult() (默认情况下仅为default(Result))。

票数 0
EN

Stack Overflow用户

发布于 2013-10-15 20:01:07

修改后的访问者代码如下:

代码语言:javascript
复制
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);
    }
}

修改后的调用代码如下:

代码语言:javascript
复制
    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正确的答案。

谢谢你,斯科特

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19366984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档