Używam następującej gramatyki ANTLR do zdefiniowania funkcji.ANTLR przetwarza łapczywie, nawet jeśli pasuje do reguły wysokiego priorytetu
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)); }
;
Ale gdy próbuję analizować dwie funkcje, takie jak poniżej,
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;
};
Następnie ANTLR nie analizuje to jak dwie definicje funkcji, ale jak jeden z następującą funkcją ciała,
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;
Czy możesz wyjaśnić to zachowanie? Ciało funkcji może mieć w sobie wszystko. Jak poprawnie zdefiniować gramatykę?
Należy zauważyć, że przepisy lexer mogą zawierać również rekurencyjne (lexer) zasady. Zauważ, że wewnątrz reguły parsera '~ ('{' | '}')' nie * nie * pasuje ** dowolny znak ** inny niż '{' i '}', ale raczej ** dowolny token ** inny niż tokeny pasujące do '{' i '}'. –