gpt4 book ai didi

ANTLR 贪婪地解析即使它可以匹配高优先级规则

转载 作者:行者123 更新时间:2023-12-04 15:33:30 25 4
gpt4 key购买 nike

我正在使用以下 ANTLR 语法来定义一个函数。

definition_function
: DEFINE FUNCTION function_name '[' language_name ']'
RETURN attribute_type '{' function_body '}'
;

function_name
: id
;

language_name
: id
;

function_body
: SCRIPT
;

SCRIPT
: '{' ('\u0020'..'\u007e' | ~( '{' | '}' ) )* '}'
{ setText(getText().substring(1, getText().length()-1)); }
;

但是当我尝试解析如下两个函数时,
define function concat[Scala] return string {
var concatenatedString = ""
for(i <- 0 until data.length) {
concatenatedString += data(i).toString
}
concatenatedString
};
define function concat[JavaScript] return string {
var str1 = data[0];
var str2 = data[1];
var str3 = data[2];
var res = str1.concat(str2,str3);
return res;
};

然后 ANTLR 不会像两个函数定义那样解析它,而是像具有以下主体的单个函数一样,
  var concatenatedString = ""
for(i <- 0 until data.length) {
concatenatedString += data(i).toString
}
concatenatedString
};
define function concat[JavaScript] return string {
var str1 = data[0];
var str2 = data[1];
var str3 = data[2];
var res = str1.concat(str2,str3);
return res;

你能解释一下这种行为吗?函数体中可以包含任何内容。我怎样才能正确定义这个语法?

最佳答案

您的规则如此匹配,因为 '\u0020'..'\u007e'来自规则 '{' ('\u0020'..'\u007e' | ~( '{' | '}' ) )* '}'两者都匹配 {} .

如果你这样定义它,你的规则应该有效:

SCRIPT
: '{' ( SCRIPT | ~( '{' | '}' ) )* '}'
;

但是,当脚本块包含,比如说,包含 { 的字符串或注释时,这将失败。或 } .这是一种匹配 SCRIPT 的方法标记,包括可能包含 { 的注释和字符串文字和 '}':
SCRIPT
: '{' SCRIPT_ATOM* '}'
;

fragment SCRIPT_ATOM
: ~[{}]
| '"' ~["]* '"'
| '//' ~[\r\n]*
| SCRIPT
;

正确解析输入的完整语法如下所示:
grammar T;

parse
: definition_function* EOF
;

definition_function
: DEFINE FUNCTION function_name '[' language_name ']' RETURN attribute_type SCRIPT ';'
;

function_name
: ID
;

language_name
: ID
;

attribute_type
: ID
;

DEFINE
: 'define'
;

FUNCTION
: 'function'
;

RETURN
: 'return'
;

ID
: [a-zA-Z_] [a-zA-Z_0-9]*
;

SCRIPT
: '{' SCRIPT_ATOM* '}'
;

SPACES
: [ \t\r\n]+ -> skip
;

fragment SCRIPT_ATOM
: ~[{}]
| '"' ~["]* '"'
| '//' ~[\r\n]*
| SCRIPT
;

它还正确解析以下输入:
define function concat[JavaScript] return string {
for (;;) {
while (true) { }
}
var s = "}"
// }
return s
};

关于ANTLR 贪婪地解析即使它可以匹配高优先级规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28496128/

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