Хороший способ разобрать код - написанный на C-подобном или Lisp-подобном (или любом другом) языке - в массив с использованием C #? - PullRequest
3 голосов
/ 11 июня 2011

Что может быть хорошим способом для разбора C-подобного или Lisp-подобного кода в массив с использованием C #?

Так, например, для небольшого фрагмента вроде следующего:

if (number > 50) {
    alert('Hello, World!');
}

Я хочу иметь возможность хранить каждое слово и символ в массиве.

Но до сих пор мне удавалось вывести массив, подобный следующему:

[0] if
[1] (number
[2] >
[3] 50)
[4] {
[5] alert('Hello,
[6] World!');
[7] }

Вы видите в расположении массива 1, где написано (number? Это не совсем то, что я хочу. Я хочу, чтобы даже эта маленькая скобка была помещена в ее собственное местоположение массива.

Сначала я думал о том, чтобы прочитать каждый символ кода, а затем начать соответственно хранить их в массивах. Но похоже, что я заново изобретаю колесо при разборе строк. Есть ли более простой способ сделать это?

p.s. Я делаю это потому, что хочу научиться правильно манипулировать строками.

Ответы [ 3 ]

3 голосов
/ 11 июня 2011

Существует много правил синтаксического анализа языка Си, и вы не можете просто маркировать код пробельными символами.

Вам нужно иметь представление о символах. Жетоны . , - + / * -> ( ) = == != < > <= >= << >> ; ? : " ' & && | || ~ (и т. Д.) - все символы. Если во время синтаксического анализа вы наткнулись на один из них, то рассматривайте его как отдельный токен, независимо от того, какой персонаж последует дальше. После «и» игнорируйте это правило, пока не перейдете к другому »/ ', если только это не после escape-символа \. Также есть обработка комментариев, триграфы, макросы и многое другое.

1 голос
/ 11 июня 2011

Читайте о fslex и fsyacc.Это может быть хорошей отправной точкой для изучения абстрактных синтаксических деревьев, лексеров и парсеров.

Также лексеры и парсеры F #, написанные с помощью fslex и fsyacc, просты в использовании в .NET-приложении.

0 голосов
/ 11 июня 2011

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

Книгу, описывающую эту самую вещь, можно найти в книге «Структура и интерпретация компьютерных программ» (также известной как SICP) , доступной в Интернете , которая используется во многих университетах по всему миру. Вы можете найти пример функции eval , которую они используют в качестве отправной точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...