Ich verwende die folgende ANTLR-Grammatik, um eine Funktion zu definieren.ANTLR analysiert gierig, obwohl die Regel mit hoher Priorität übereinstimmen kann
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)); }
;
Aber wenn ich versuche, wie unten zwei Funktionen zu analysieren,
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;
};
Dann ANTLR nicht diese wie zwei Funktionsdefinitionen analysieren, sondern wie eine einzige Funktion mit dem folgenden Körper,
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;
Können Sie dieses Verhalten erklären? Der Körper der Funktion kann alles enthalten. Wie kann ich diese Grammatik korrekt definieren?
Beachten Sie, dass Lexer Regeln auch rekursiv enthalten (Lexer) Regeln. Beachten Sie, dass innerhalb einer Parser-Regel '~ ('{' | '}')' nicht * mit irgendeinem char ** anders als '{' und '}' übereinstimmt, sondern ** mit einem anderen Token ** die Token, die mit '{' und '}' übereinstimmen. –