Как разобрать фактический код, такой как stackoverflow / intellisense / etc? - PullRequest
3 голосов
/ 19 августа 2010

Мне было интересно, как stackoverflow анализирует все виды различного кода и идентифицирует ключевые слова, специальные символы, форматирование пробелов и т. Д. Он делает это для большей части кода, я верю, и я заметил, что он даже достаточно сложен, чтобы понять отношения между всемон анализирует, например, так:

String mystring1 = "inquotes"; //incomment
String mystring2 = "inquotes//incomment";
String mystring3 = //incomment"inquotes";

Многие IDE также делают это.Как это сделать?

Редактировать: Дальнейшее объяснение - я не спрашиваю о разборе текста, мой вопрос: как только я пройду эту часть ... есть ли что-то вроде универсальной XML-схемы или перекрестнойиерархии форматов кода, который описывает, какие строки являются ключевыми словами, какие символы обозначают комментарии, текстовые строки, логические операторы и т. д. Или я должен стать гуру синтаксиса для любого языка, который я хочу анализировать точно?

Ответы [ 2 ]

3 голосов
/ 19 августа 2010

Чтобы ваш IDE / компилятор / интерпретатор действительно "понимал" и раскрашивал код, вам нужно проанализировать его и выделить различные синтаксические части. Классическим справочником для этого является Книга Дракона , «Компиляторы: принципы, методы и инструменты». Вы можете увидеть некоторые трудности в конструкциях, подобных этой

i+++++i; 

или

list<list<hash<list<int>,hash<int,<list>>>>>;
//or just matching parens 

Правильно сделать это - сложная проблема . Некоторые языки, такие как java, делают это проще, чем другие, такие как C и C ++ (у обоих есть стандарты) или ruby ​​(у которых даже нет спецификации, а реализация зависит от спецификации). Однако, если вы хотите сделать всего несколько битов выделения, вы можете пропустить большие части грамматики и получить решение на 80% легче. Я подозреваю, что движок SO знает о строках и нескольких различных типах комментариев, и этого достаточно для их цели.

Сложность между 80% и 100% является одной из причин того, что большинство IDE имеют подсветку синтаксиса для C ++, но Visual C ++ все еще не поддерживает C ++ рефакторинг. Для выделения нескольких ошибок, вероятно, все в порядке. Когда вы проводите рефакторинг, вам нужно по-настоящему понимать область действия переменной в разных пространствах имен, а также все виды указателей.

2 голосов
/ 19 августа 2010

Чтобы правильно выделить язык, вы должны построить дерево разбора .Для этого сначала необходимо выполнить токенизацию строки, а затем выполнить синтаксический анализ сверху вниз или снизу вверх.После этого что-то обходит дерево и выделяет части исходной строки, соответствующие узлам определенного вида.

Чтобы действительно это понять, вам нужно прочитать книгу об основах проектирования компилятора / языка программирования,Соответствующие темы: токенизаторы , синтаксический анализ и грамматика .

...