Посмотрите на эту часть вашей грамматики:
contents:
foobar
| contents foobar
;
foobar:
foos
| bars
;
foos:
foo
| foos foo
;
bars:
bar
| bars bar
;
Итак, contents
- это список foobar
с, а foobar
- это либо список foo
с, либо списокbar
s.Это неоднозначно, потому что вход, состоящий из двух последовательных foo
с, может быть проанализирован как contents
путем интерпретации двух foo
с как одного foobar
, содержащего два foo
с, или как два foobar
с.содержащий один foo
каждый.
Простой способ избавиться от этой неоднозначности - отказаться от внутренних списков:
contents: foobar | contents foobar;
foobar: foo | bar;
Если вам нужны последовательные foo
s для обработки по-разному,вы все еще можете обнаружить их во время пост-обработки.Если вам абсолютно необходимо обработать это в грамматике, вы можете реструктурировать грамматику так, чтобы за foos
мог следовать только bars
(не другой foos
) или наоборот.