Я довольно новичок в ANTLR, и мне нужно объяснение его поведения при распознавании входной строки.Из того, что я понял, правила, начинающиеся с заглавной буквы, являются правилами лексера, а правила, начинающиеся с заглавной буквы, являются правилами синтаксического анализатора.
У меня есть следующий язык, и мне нужно написать грамматику соответственно:
Таким образом, L должен принимать все строки, состоящие из:
- непустая строка с b и / или c
- d
- непустая строка с a и / илиc
Это первая грамматика, которую я написал, и у меня нет проблем с ней при распознавании ввода bbbcbcbcbcdaaacacacaaaa
:
start : (alfa 'd' beta);
alfa : ('b'|'c') | ('b'|'c') alfa;
beta : ('a'|'c') | ('a'|'c') beta;
WS : (' '|'\n'|'\t'|'\r')->skip;
Но если я изменю ее какпосле этого та же строка больше не распознается (ниже вы можете увидеть результат отладчика ANTLRWorks):
start : (alfa 'd' beta);
alfa : ALFA_VALS | ALFA_VALS alfa;
beta : BETA_VALS | BETA_VALS beta;
ALFA_VALS: ('b'|'c');
BETA_VALS: ('a'|'c');
WS : (' '|'\n'|'\t'|'\r')->skip;
Кроме того, если яизмените ALFA_VALS
и BETA_VALS
на alfa_vals
и beta_vals
соответственно, проблем не возникает.
Может ли кто-нибудь дать мне объяснение этому поведению?Потому что я не смог найти конкретный способ решения этой проблемы.
Большое вам спасибо!