gpt4 book ai didi

带有 @init block 的 ANTLR4 词法分析器规则

转载 作者:行者123 更新时间:2023-12-01 06:27:39 25 4
gpt4 key购买 nike

我在我的 ANTLR v3 语法文件中定义了这个词法分析器规则 - 它用双引号对文本进行数学运算。
我需要将其转换为 ANTLR v4。 ANTLR 编译器抛出错误“语法错误:匹配词法规则时不匹配的输入‘@’期望 COLON”(在 @init 行中)。词法分析器规则可以包含 @init 块吗?这应该怎么改写?

DOUBLE_QUOTED_CHARACTERS
@init
{
int doubleQuoteMark = input.mark();
int semiColonPos = -1;
}
: ('"' WS* '"') => '"' WS* '"' { $channel = HIDDEN; }
{
RecognitionException re = new RecognitionException("Illegal empty quotes\"\"!", input);
reportError(re);
}
| '"' (options {greedy=false;}: ~('"'))+
('"'|';' { semiColonPos = input.index(); } ('\u0020'|'\t')* ('\n'|'\r'))
{
if (semiColonPos >= 0)
{
input.rewind(doubleQuoteMark);

RecognitionException re = new RecognitionException("Missing closing double quote!", input);
reportError(re);
input.consume();
}
else
{
setText(getText().substring(1, getText().length()-1));
}
}
;

样本数据:
  • ""-> 抛出错误“非法的空引号!”;
  • "asd -> 抛出错误"缺少结束双引号!"
  • “text” -> 返回文本(有效输入,“...”的内容)
  • 最佳答案

    我认为这是做到这一点的正确方法。

    DOUBLE_QUOTED_CHARACTERS
    :
    {
    int doubleQuoteMark = input.mark();
    int semiColonPos = -1;
    }
    (
    ('"' WS* '"') => '"' WS* '"' { $channel = HIDDEN; }
    {
    RecognitionException re = new RecognitionException("Illegal empty quotes\"\"!", input);
    reportError(re);
    }
    | '"' (options {greedy=false;}: ~('"'))+
    ('"'|';' { semiColonPos = input.index(); } ('\u0020'|'\t')* ('\n'|'\r'))
    {
    if (semiColonPos >= 0)
    {
    input.rewind(doubleQuoteMark);

    RecognitionException re = new RecognitionException("Missing closing double quote!", input);
    reportError(re);
    input.consume();
    }
    else
    {
    setText(getText().substring(1, getText().length()-1));
    }
    }
    )
    ;

    上面还有一些其他错误,例如 WS .. => ... 但我不会在此答案中更正它们。只是为了让事情简单。我从 here 得到提示

    只是为了防止该链接在一段时间后移动或变得无效,按原样引用文本:

    从 4.2 开始,词法分析器 Action 可以出现在任何地方,而不仅仅是最外层选项的末尾。词法分析器根据操作在规则中的位置在适当的输入位置执行操作。要为具有多个选项的角色执行单个操作,您可以将 alt 括在括号中,然后将操作放在后面:
    END : ('endif'|'end') {System.out.println("found an end");} ;

    The action conforms to the syntax of the target language. ANTLR copies the action’s contents into the generated code verbatim; there is no translation of expressions like $x.y as there is in parser actions.

    Only actions within the outermost token rule are executed. In other words, if STRING calls ESC_CHAR and ESC_CHAR has an action, that action is not executed when the lexer starts matching in STRING.

    关于带有 @init block 的 ANTLR4 词法分析器规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26405713/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com