Antlr4 - исправьте грамматику, чтобы соответствовать моему внутреннему языку - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть внутренний язык, где мне нужно создать грамматику, чтобы разобрать язык.Но по какой-то причине я не могу сопоставить весь язык.

Язык составлен из этих ключевых слов:

$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;

1 Ответ

0 голосов
/ 09 апреля 2019

В вашей грамматике LIST_OF_VALUES - это правило лексера, поэтому список значений будет распознаваться как один токен. Пробелы (или, скорее, пропущенные токены вообще) отбрасываются только между токенами, а не в одном токене. Поэтому, если вы хотите, чтобы пробелы отбрасывались в середине чего-либо, вы не хотите, чтобы это что-то было одним токеном.

Таким образом, вместо правила лексера LIST_OF_VALUES у вас должно быть правило синтаксического анализатора listOfValues, которое состоит из нескольких идентификаторов и токенов запятой. То же самое для списка параметров $NOT.

...