Обнаружение регулярного выражения в контенте во время разбора - PullRequest
3 голосов
/ 26 мая 2010

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

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

Случай 1: Например, при разборе фрагмента кода JavaScript,

var phone="(304)434-5454"
phone=phone.replace(/[\(\)-]/g, "") 
//Returns "3044345454" (removes "(", ")", and "-")

Символы '(', '[' и т. Д. Сопоставляются как начало новых областей, которые никогда не могут быть закрыты.

Случай 2: И, для фрагмента кода Perl,

 # Replace backslashes with two forward slashes
 # Any character can be used to delimit the regex
 $FILE_PATH =~ s@\\@//@g; 

// сопоставляется как комментарий ...

Как я могу обнаружить регулярное выражение в тексте содержимого "C-подобного" файла программы?

Ответы [ 2 ]

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

невозможно.

Возьмите это, например:

m =~ s/a/b/g;

Может быть как C, так и perl.

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

Другой пример:

m+foo *bar[index]+i

Лучшее, что вы можете получить, это какие-то крайне смутные догадки. Сложность связана с тем, что регулярное выражение - это последовательность символов, которая может быть практически любой.

Вам лучше очистить вашу обработку ошибок. Синтаксический анализатор не должен «ломаться», если некоторые скобки отсутствуют или видны лишние скобки.

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

Что ж, ваша грамматика токенов должна учитывать синтаксис регулярных выражений. Классические парсеры состоят из двух слоев: что-то для токенизации ввода, а затем что-то для синтаксического анализа грамматики. Синтаксис языка обычно выражается в терминах токенов , поэтому работа токенизатора состоит в том, чтобы передавать их потоку в анализатор. Обычно токены сами по себе являются регулярными выражениями или, точнее, огромным регулярным выражением вещей ИЛИ вместе взятыми. В каждой позиции символа на входе одно из регулярных выражений токена должно совпадать, иначе символ недопустим.

Теперь есть и другие методы синтаксического анализа, которые сортируют токенизацию с помощью синтаксического анализа. (Например, парсеры "PEG")

edit & mdash; еще одно замечание: вы не можете анализировать языки, такие как Javascript или Perl, только с помощью регулярного выражения.

...