【问题标题】:c# migrating to ANTLR 4 from ANTLR 3 with ASTc# 使用 AST 从 ANTLR 3 迁移到 ANTLR 4
【发布时间】:2014-08-04 10:35:17
【问题描述】:

我继承了一些基于 ANTLR 3 的 c# 代码。 我们有一些使用 AST(抽象语法树)选项的语法文件,我们使用这些语法将具有非常奇怪的“语言”的文本文件解析为对象。我们使用 AST 作为中间对象,而不是将它们转换为我们需要的真实对象(需要更多处理)。

我对 ANTLR 一无所知,但目前我们在 ANTLR 处理文件时遇到了应用程序性能瓶颈。 由于我们使用的是 ANTLR 3,我们认为如果我们迁移到 ANTLR,我们可能会获得性能提升(并且还可以获得最新和最好的 ANTLR 版本,这始终是一个很好的做法)。 我已经读到 AST 不再存在于 ANTLR 4 中,替换它的最佳(和最简单)方法是什么,它对我当前的代码意味着什么。

升级的最佳方法是什么?它真的会给我们带来性能提升吗?

其中一个语法文件的示例(有6个,这是最简单的一个):

 grammar Rules;

options
{
    language=CSharp2;
    output=AST;
    ASTLabelType=CommonTree;
    superClass = OOPLParserBase;
}

tokens
{
    OOPL_MODEL;
}


@lexer::namespace { TestParser.Common.RulesParser }

@parser::namespace { TestParser.Common.RulesParser }

@header
{
using System.Collections.Generic;
using TestParser.OOPLModel;
}

@members
{

public RulesParser() : base(null)
{
}

protected override CommonTree GetAst()
{
    return root().Tree as CommonTree;
}

protected override Lexer GetLexer()
{
    return new RulesLexer();
}

}

//semantic analysis

root            :   header (rule_line COMMENT?)+ -> ^(header rule_line+);

header          :   header_comment+ -> ^(OOPL_MODEL<OOPLModel>[new CommonToken(OOPL_MODEL), "1.0"] header_comment+);

header_comment      :   COMMENT -> ^(COMMENT<OOPLComment>[$COMMENT, $COMMENT.Text]);

rule_line       :   parameter RULE_TYPE COMMA  PARAMETER_NAME COLON condition -> ^(RULE_TYPE<OOPLBlock>[$RULE_TYPE, $RULE_TYPE.Text] parameter PARAMETER_NAME<OOPLValue>[$PARAMETER_NAME, $PARAMETER_NAME.Text] condition);

parameter       :   PARAMETER_NAME EQUALS (integer_value = INTEGER | real_value = REAL |string_value = STRING) COMMA -> ^(PARAMETER_NAME<OOPLKeyedValue>[$PARAMETER_NAME, $PARAMETER_NAME.Text, SingleWhereNotNull<IToken>($integer_value, $string_value, $real_value).Text]);

condition       :   condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value COMMA condition_value;

condition_value     :   (asterisk| parameter_name | positive_integer);

asterisk        :   ASTERISK -> ^(ASTERISK<OOPLValue>[$ASTERISK, $ASTERISK.Text]);

parameter_name      :   PARAMETER_NAME -> ^(PARAMETER_NAME<OOPLValue>[$PARAMETER_NAME, $PARAMETER_NAME.Text]);

positive_integer    :   INTEGER -> ^(INTEGER<OOPLValue>[$INTEGER, $INTEGER.Text]);

//lexical analysis

EQUALS          :   '=';

NEW_LINE_R      :   '\r' { $channel = HIDDEN; };

NEW_LINE_N      :   '\n' { $channel = HIDDEN; };

RULE_TYPE       :   ('Time'|'TIME'|'Lol'|'LOL'|'World'|'WORLD'|'Template'|'TEMPLATE');

DOUBLE_COLON            :       COLON COLON;

INTEGER         :   MINUS? DIGIT+;

REAL            :       INTEGER '.' INTEGER;

PARAMETER_NAME      :   ASTERISK? (LETTER|DIGIT|UNDERSCORE|FORWARDSLASH|DOUBLE_COLON|MINUS)+ ASTERISK?;


WS  :   ( ' '
        | '\t'
        | NEW_LINE_R
        | NEW_LINE_N
        ) { $channel = HIDDEN; } ;

COMMENT                 :       '#' ( options {greedy=false;} : . )* NEW_LINE_R? NEW_LINE_N;

STRING          :   '"'~('"')* '"';

fragment
MINUS   :   '-';

COMMA           :   ',';

COLON                   :       ':';

fragment
DOT         :   '.';


ASTERISK        :   '*';

fragment
FORWARDSLASH        :   '/';

fragment
UNDERSCORE      :   '_';

fragment
DIGIT           :   '0'..'9';   

fragment
LETTER          :   'A'..'Z' | 'a'..'z';

【问题讨论】:

    标签: c# migration antlr antlr4


    【解决方案1】:

    我会在解析后仅在 C# 代码中进行转换。

    在这种情况下,我什至会跳过中间 AST 形式,将解析树(由 ANTLR4 提供)直接转换为目标表示。

    有些人更喜欢 ParseTreeListener/ParseTreeWalkers,它可以帮助您遍历解析树。如果您想要一些预构建代码,请查看这些。一定要使用类型化的 ParseTreeWalker,它应该被命名为RulesParseTreeListener&lt;&gt;,继承和调整你的需要。 链接:https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Parse+Tree+Listeners

    我不推荐在解析期间调用的 ParseTreeVisitors(而不是在解析之后)。它们仅适用于不是上下文无关且在解析期间需要代码的简单操作或语法。如果需求稍后发展,您可以更灵活地使用自定义处理或侦听器/步行器。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多