gpt4 book ai didi

java - ANTLR4 - 嵌套函数中的参数

转载 作者:太空宇宙 更新时间:2023-11-04 09:15:24 25 4
gpt4 key购买 nike

我的 antlr 语法或(词法分析器)有问题。就我而言,我需要解析带有自定义文本的字符串并在其中查找函数。函数$foo($bar(3),'strArg')的格式。我在这篇文章ANTLR Nested Functions中找到了解决方案并根据我的需要对其进行了一些改进。但在测试不同的情况时,我发现了一个会阻止解析器的情况:$foo($3,'strArg')。这将抛出 IncolectSyntax 异常。我尝试了很多变体(例如不跳过 $ 并将其包含在解析树中),但所有这些尝试均不成功

词法分析器

lexer grammar TLexer;

TEXT
: ~[$]
;

FUNCTION_START
: '$' -> pushMode(IN_FUNCTION), skip
;

mode IN_FUNCTION;
FUNTION_NESTED : '$' -> pushMode(IN_FUNCTION), skip;
ID : [a-zA-Z_]+;
PAR_OPEN : '(';
PAR_CLOSE : ')' -> popMode;
NUMBER : [0-9]+;
STRING : '\'' ( ~'\'' | '\'\'' )* '\'';
COMMA : ',';
SPACE : [ \t\r\n]-> skip;

解析器


options {
tokenVocab=TLexer;
}

parse
: atom* EOF
;

atom
: text
| function
;

text
: TEXT+
;

function
: ID params
;

params
: PAR_OPEN ( param ( COMMA param )* )? PAR_CLOSE
;

param
: NUMBER
| STRING
| function
;

最佳答案

解析器在 $foo($3,'strArg') 上不会失败,因为当它遇到第二个 $ 时,它已经处于 IN_FUNCTION 模式并且需要一个参数。它会跳过该字符并读取NUMBER

如果您希望它失败,您需要在词法分析器中取消跳过美元符号:

FUNCTION_START : '$' -> pushMode(IN_FUNCTION);

mode IN_FUNCTION;
FUNTION_START : '$' -> pushMode(IN_FUNCTION);

并修改function规则:

function : FUNCTION_START ID params;

关于java - ANTLR4 - 嵌套函数中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59096341/

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