Заданный ввод с повторяющимися BLOCK
с, где каждый блок имеет повторяющиеся записи BEGIN EVENT
и END EVENT
(END EVENT
всегда следует за BEGIN EVENT
):
[TIMESTAMP] BLOCK
[TIMESTAMP] BEGIN EVENT
[TIMESTAMP] END EVENT
[TIMESTAMP] BEGIN EVENT
[TIMESTAMP] END EVENT
...
[TIMESTAMP] BLOCK
Как устранить неоднозначностьэта грамматика с LR (1)?Я использую LALRPOP , и минимальный пример этого:
Timestamp = "[TIMESTAMP]";
BlockHeader = Timestamp "BLOCK";
Begin = Timestamp "BEGIN" "EVENT";
End = Timestamp "END" "EVENT";
Block = BlockHeader (Begin End)+;
pub Blocks = Block*
Поскольку LR (1) может смотреть только на один токен вперед, эта грамматика неоднозначна, так как LALRPOP услужливоговорит вам (частичная ошибка):
Local ambiguity detected
The problem arises after having observed the following symbols in the input:
BlockHeader (Begin End)+
At that point, if the next token is a `"[TIMESTAMP]"`, then the parser can proceed in two different ways.
First, the parser could execute the production at
/home/<snip>.lalrpop:51:9: 51:32, which would consume
the top 2 token(s) from the stack and produce a `Block`. This might then yield a parse tree like
BlockHeader (Begin End)+ Block
├─Block────────────────┤ │
├─Block+───────────────┘ │
└─Block+─────────────────────┘
Alternatively, the parser could shift the `"[TIMESTAMP]"` token and later use it to construct a
`Timestamp`. This might then yield a parse tree like
(Begin End)+ "[TIMESTAMP]" "BEGIN" "EVENT" End
│ ├─Timestamp─┘ │ │
│ └─Begin─────────────────────┘ │
└─(Begin End)+───────────────────────────────┘
Я вижу, что это говорит мне, что после синтаксического анализа BlockHeader, Begin и End он не может определить, является ли следующий токен другим Begin или началомдругой блок.Я не нашел способа устранить это в LR (1), но могу только предположить, что это отсутствие понимания с моей стороны, а не наследственное ограничение грамматик LR (1)?