В древовидной грамматике, может ли конфликт приоритета / ассоциативности операторов вызвать сбой синтаксического анализа во время выполнения?
Рассмотрим инфиксный оператор, такой как подмножество (⊂). Оператор подмножества не ассоциативен, потому что его результат (логическое значение) сам по себе не является набором и поэтому не может быть передан в ту или иную сторону оператора подмножества. Рассмотреть возможность:
S ⊂ T ⊂ M
В идеале это был бы сбой синтаксического анализа, но tree-sitter, похоже, не допускает сбоев синтаксического анализа, основанных на конфликте операторов; вместо этого требуется, чтобы вы однозначно разрешили конфликт во время генерации парсера, указав ассоциативность или приоритет. Есть ли способ указать специалисту по дереву, что это должен быть конфликт синтаксического анализа? Не только для неассоциативных операторов одного типа, но и между разными операторами с эквивалентным приоритетом, которые не являются ассоциативными, например:
S ⊂ T ⊆ M
Или это единственное решение - указать однозначный синтаксический анализ, а затем обработать его на семантическом уровне?
1 ответ
Вы правы, это нужно обрабатывать на семантическом уровне. Таким образом, ⊂ следует пометить в грамматике как левоассоциативную для целей синтаксического анализа, хотя это не так. Для строки
(op ⊂
(op ⊂
(id S)
(id T)
)
(id M)
)
На семантическом уровне вы можете добавить правило, проверяющее, есть ли дочерние узлы, которые также