当前位置: 首页 > 知识库问答 >
问题:

用@init语句导入语法时遇到的问题

朱兴学
2023-03-14

如果我注释了三个@init操作中的两个,那么无论wich,编译都很好。

我将语法转换为Java,并按照Antlr4网站中的教程进行编译:在java-classpath.;../antlr-4.2-complete.jar org.antlr.v4.tool grammar_a2.g4时,我会得到相同的错误,但会指示错误94,action_redefinition。

我尝试用antlr版本4.1和版本4.2编译。

grammar Grammar_A;

@parser::members
{
    protected const int EOF = Eof;
    int numPrints, numReads;
}

@lexer::members
{
    protected const int EOF = Eof;
    protected const int HIDDEN = Hidden;
}

program
@init { numPrints = numReads = 0; }
    :   (printExpression | readExpression)+
    ;

printExpression
@init {numPrints++;}
    :   PRINT_KEY 
        ( id
            | QUOT id QUOT
        )
        SEMICOLON
;

readExpression
@init {numReads++;}
    : ID READ_KEY SEMICOLON
;

id 
    :   ID | PRINT_KEY | READ_KEY
    ;

WS
    :   (' ' | '\r' | '\n') -> channel(HIDDEN)
    ;

PRINT_KEY : 'print';
READ_KEY : 'read';

ID : ('a'..'z')+ ;


SEMICOLON : ';';
QUOT : '"'; 

grammar_a1

grammar Grammar_A1;

@parser::members
{
    protected const int EOF = Eof;
}

@lexer::members
{
    protected const int EOF = Eof;
    protected const int HIDDEN = Hidden;
}

id 
    :   ID | PRINT_KEY | READ_KEY
    ;    

WS
    :   (' ' | '\r' | '\n') -> channel(HIDDEN)
    ;

PRINT_KEY : 'print';
READ_KEY : 'read';

ID : ('a'..'z')+ ;

grammar_a2

grammar Grammar_A2;

import Grammar_A1; 


@parser::members {
    int numPrints, numReads;
}

program
@init { numPrints = numReads = 0; }
    :   (printExpression | readExpression)+
    ;

printExpression
@init {numPrints++;}
    :   PRINT_KEY 
        ( id
            | QUOT id QUOT
        )
        SEMICOLON
;

readExpression
@init {numReads++;}
    : ID READ_KEY SEMICOLON
;


SEMICOLON : ';';
QUOT : '"';

共有1个答案

澹台镜
2023-03-14

>

  • 如果您可以在Java代码中重现此问题(看起来您可以),您可以在引用实现的问题跟踪器上将其作为bug报告。否则,如果这是特定于C#目标的,您可以在C#目标的问题跟踪器上报告它。

    如果只有一种语法,我强烈建议您考虑的唯一分离方法是将其拆分为lexer语法parser语法,而不要使用import语句。import语句真正起作用的情况很少。

    您在问题中指示的操作对于正确的解析并不是必要的,因此应该将其重新定位到监听器或访问者,在解析完成后执行。在正确的位置执行这些操作后,您将不再受到所描述的问题的限制。

  •  类似资料:
    • 我试图从Coldfusion 10服务器执行一个MySQL insert语句,这会导致一个Cold Fusion错误。 当从MySQL工作台执行MySQL insert语句时,它可以正常工作。此外,我确认在Coldfusion 10服务器上执行的select语句工作正常。 接下来,我尝试设置变量“binlog format”cfquery本身。 这导致了一个新的CFE。 最后,我尝试在“MySQL

    • 我正在尝试将我的ANTLR4语法拆分到多个文件中,这样我可以更容易地测试它们,我正在使用gradle作为java项目中的构建工具。 如下所示: 所有开源的代码都在下一个链接中:https://github.com/kanekotic/specflow.rider/tree/antlr4_multiple_grammar

    • 我正在使用ArcGIS JSAPI 4.12,并希望使用空间错觉在地图上绘制军事符号。 当我向脚本添加时,控制台返回错误 未捕获的SyntaxError:无法在模块外部使用导入语句` 因此,我将添加到脚本中,然后它返回 未捕获的引用错误:未定义ms 这是我的密码: 因此,无论我是否添加,都会出现错误。然而,在空间幻觉的官方文件中,脚本中没有任何。我现在真的很困惑。他们如何在不添加类型的情况下使其工

    • 试图将用户模型中的“uuid”作为

    • 是否有人使用es2015语法编写jasmine/jest测试?需要多少填隙/填充胶/选区划分? 我无法正确导入函数。我有一个模块:../utils/TweetUtils.js 和一个测试套件: ../../\uuuuu测试\uuuu/TweetUtils-test.js 如果我用这样的东西将控制台输出破解到套件中:

    • 我有3个不同的TS文件,在1个主TS文件中动态加载2个TS文件,如下所示 现在,在这两个TS文件中,我正在导入jquery和jquery父TS文件 我的tsconfig.json 所以我的问题是jquery文件加载3次还是只加载一次。