Какой синтаксический сахар или языковые особенности делают язык сложным для анализа?

Я немного искал и не нашел вопрос, который "прямо" ответил на этот вопрос.

В любом случае, основная суть этого вопроса в том, что мне интересно, что за "языковая особенность" или "синтаксис", которые делают язык основной проблемой при создании синтаксического анализатора, подсветке синтаксиса и т. Д.?

Это может быть субъективно, но я подумал, например, о разнице в синтаксическом анализе языка, например, скажем Lisp, например, с его структурой (func parms и т. Д.), По сравнению с чем-то вроде C++ со всеми шаблонами, скобками и так далее,

2 ответа

Решение

Языки, которые поддерживают расширение синтаксиса с помощью макросов или другими средствами, не могут быть полностью проанализированы, если вы не сможете правильно развернуть макросы. Для языков с полными процедурными макросами, такими как Lisp или Curl, вы не сможете полностью проанализировать без реализации самого языка!

Обычно для подсветки синтаксиса для таких языков вы не пытаетесь расширить макросы и предполагать, что макросы следуют обычным языковым идиомам.

С точки зрения формальных языков и грамматик ИМХО есть два основных аспекта. Прежде всего, грамматика для вашего языка должна принадлежать к какой-то легко обрабатываемой категории. Например, язык с контекстно-свободной грамматикой, который означает, что, например, ваш язык имеет слишком много элементов, количество которых зависит друг от друга, например, такие как открытые и закрытые скобки, для анализа может потребоваться бесконечно много памяти. C++ имеет контекстно-зависимую грамматику, что еще хуже, примером может быть грамматика, имеющая три элемента с взаимозависимыми значениями. Другой аспект связан с неоднозначностью при разборе. В неоднозначной грамматике вы можете анализировать один и тот же текст по-разному, что означает, что вы должны найти правильный путь для вашего алгоритма синтаксического анализа - большинство из них вообще не допускают двусмысленности.

Я не совсем уверен, но я бы сказал, что синтаксический анализ скобок и пробелов (при разумном определении) одинаково сложен. В обоих случаях вам понадобится счетчик для проверки уровня вложенности блоков, однако, используя пробелы, вы можете идентифицировать уровень локально (подсчитывая пробелы), и вы можете быть уверены, что ваш счетчик не опустится ниже нуля, что может произойти, когда вы иметь больше закрывающих скобок, чем открывающих.

Другие вопросы по тегам