Какой синтаксический сахар или языковые особенности делают язык трудным / трудным для анализа? - PullRequest
3 голосов
/ 13 мая 2010

Я провел поиск и не нашел вопрос, который «напрямую» ответил на этот вопрос.

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

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

Ответы [ 2 ]

4 голосов
/ 13 мая 2010

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

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

1 голос
/ 19 мая 2010

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

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

...