У меня есть внутренний язык, где мне нужно создать грамматику, чтобы разобрать язык.Но по какой-то причине я не могу сопоставить весь язык.
Язык составлен из этих ключевых слов:
$IF
$FROM
$THEN
$ANY
$EMPTY
$NOT
$COMPLEX
$COUNT
$COUNT_COMPLEX
Модуль компилятора или простейшее выражение или оператор должен следовать этому порядку:
$IF ... $FROM ... $THEN
Я могу соответствовать большинству комбинаций.однако я не могу сопоставить список значений с пробелом в середине любого значения, например:
$IF Mechanical Instability,Deformity $FROM Type
grammar Trigger;
prog: expr EOF;
expr
: IF (ANY|EMPTY|NOT|comparator|count|complex|count_complex|IDENTIFIER|LIST_VALUES) FROM IDENTIFIER THEN
| expr binary expr
| LPAREN expr RPAREN
;
comparator : (GT | GE | LT | LE | EQ)(INT|IDENTIFIER);
binary : AND | OR;
count : COUNT LPAREN (IDENTIFIER | DISTINCT) RPAREN comparator;
complex : COMPLEX LPAREN expr RPAREN;
count_complex : COUNT_COMPLEX LPAREN (expr | DISTINCT IDENTIFIER expr) RPAREN comparator;
IF : '$IF';
FROM : '$FROM';
THEN : '$THEN';
AND : '$AND' ;
ANY : '$ANY';
EMPTY : '$EMPTY';
DISTINCT : '$DISTINCT';
COUNT : '$COUNT';
COUNT_COMPLEX : '$COUNT_COMPLEX';
COMPLEX : '$COMPLEX';
OR : '$OR' ;
NOT : '$NOT' LPAREN CHAR+(',' CHAR)*? RPAREN;
GT : '>' ;
GE : '>=' ;
LT : '<' ;
LE : '<=' ;
EQ : '=' ;
LPAREN : '(' ;
RPAREN : ')' ;
INT : '-'?[0-9]+[0-9]*;
IDENTIFIER : [a-zA-Z_.'0-9]+;
LIST_VALUES : IDENTIFIER(',' IDENTIFIER)* ;
CHAR : [a-zA-Z_0-9];
WS : [ \r\t\u000C\n]+ -> skip;