Некоторые возможные проблемы в вашем коде:
Я думаю, вы хотите, чтобы ваш тег ID имел регулярное выражение +
, чтобы он мог иметь длину 1 или более, например:
ID : ('a'..'z'|'A'..'Z'|'_')+
;
Выглядит так, как будто вы пропускаете кавычки вокруг знака =
:
assignment_statement: ID '=' arithmetic_expression;
РЕДАКТИРОВАТЬ
Относительно проблемы левой рекурсии: ANTLRочень мощный из-за функциональности регулярных выражений.Хотя EBNF (как и тот, который вы представили) может быть ограничен в способах выражения, ANTLR может использоваться для выражения некоторых правил грамматики в гораздо более простой форме.Например, если вы хотите иметь список Statement_List в вашем составном_статеме, просто используйте правило Statement с закрытием (*
).Вот так:
compound_statement: 'begin' statement* 'end';
Неожиданно вы можете удалить ненужные правила, такие как Statement_list.