Как правильно расширить грамматику ANTLR4? - PullRequest
0 голосов
/ 08 января 2020

У меня есть требование, когда я хочу расширить существующую грамматику A с помощью дополнений, определенных в грамматике B, для создания грамматики C.

Я уже пробовал импортировать грамматику A в B, но это только выбор некоторые вещи определены в грамматике A. Я предполагаю, что неиспользуемое содержимое A в B пропускается при создании классов. Это имеет смысл, поскольку требование состоит не в том, чтобы наследовать, а смешивать / объединять / объединять две грамматики.

Просто для понимания (оригинальная грамматика огромна), пример:

Файл : A.g4:

grammar A;

keywords
    : X
    | Y
    | Z
    ;

X: 'X';
Y: 'Y';
Z: 'Z'; 

Файл: B.g4:

grammar B;

keywords
    : A
    | B
    | C
    ;

A: 'A';
B: 'B';
C: 'C'; 

Файл: C .g4:

grammar C;

keywords
    : X
    | Y
    | Z
    | A
    | B
    | C
    ;

X: 'X';
Y: 'Y';
Z: 'Z';
A: 'A';
B: 'B';
C: 'C'; 

Примечание: У меня нет возможности напрямую манипулировать грамматикой A, но я хочу сохранить всю функциональность в грамматике A вместе с дополнительными правилами / ключевыми словами и др c. определяется в грамматике B, как показано выше.

Любая помощь будет высоко ценится. Спасибо.

1 Ответ

0 голосов
/ 08 января 2020

Импорт грамматики может не работать так, как вы ожидаете. Правила в импортируемой грамматике имеют приоритет над именованными правилами в импортированной грамматике. Таким образом, вы не можете переопределить существующее правило в своей основной грамматике. См. Также описание в репозитории ANTLR4 :

Думайте об импорте как об интеллектуальном операторе включения (который не включает в себя уже определенные правила).

Однако должна быть возможность переопределить правило во второй грамматике импорта. В вашем случае вы бы не определили keywords в своей основной грамматике (я предполагаю, что это C). Импортируйте грамматики A и B в обратном порядке, если вы хотите, чтобы правило B ´s keywords имело приоритет над правилом в A.

import B, A;

Это также продемонстрировано в изображение из этого файла Markdown:

enter image description here

Правило r из грамматики G2 игнорируется, поскольку оно импортируется последним, поэтому G3 вроде "переопределяет" это.

...