Sto usando la seguente grammatica ANTLR per definire una funzione.ANTLR analizza avidamente anche se può corrispondere alla regola ad alta priorità
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)); }
;
Ma quando si tenta di analizzare due funzioni come di seguito,
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;
};
Poi ANTLR non analizza questi come due definizioni di funzione, ma come una singola funzione con il seguente,
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;
Puoi spiegare questo comportamento? Il corpo della funzione può avere qualsiasi cosa in esso. Come posso definire correttamente questa grammatica?
Nota che le regole lexer possono anche contenere regole (lexer) ricorsive. Nota che all'interno di una regola parser '~ ('{' | '}')' fa * non * corrisponde a ** qualsiasi char ** altro che '{' e '}', ma piuttosto, ** qualsiasi token ** diverso da i token che corrispondono a '{' e '}'. –