Я разрабатываю свой собственный язык с помощью ANTLR 4, вот часть моей грамматики.
program: main EOF; // the program rule.
main: NEWLINE* study NEWLINE* ; // the main rule;
study : studyBlock (NEWLINE* assignVariableBlock)? ; // the study rule.
/* simple assign name = "name" */
simpleAssign: name = ID '=' value = (STRING | BOOLEAN | INTEGER | DOUBLE);
/* study parameters */
studyParameters: (| ( simpleAssign (',' simpleAssign)*) );
/* study block */
studyBlock: 'study' '(' studyParameters ')' NEWLINE ;
/* assign variables block */
assignVariableBlock: simpleAssign*;
Правило simpleAssign используется в правиле studyParameters и в правиле assignVariableBlock, так как я могу получить переменные, объявленные в каждом конкретном блоке c. Например, если мой DSL выглядит следующим образом:
study(string = "string", string2 = "string2")
x = "string3"
y = "string4"
Как я могу иметь в моем слушателе
// study parameters
[string:"string",string2:"string2"] // map
// tmp variabels
[x:"string3",y:"string4"] // map