Как к efficently создают интерпретатор (lexer+parser) в C?

Я пытаюсь сделать метаязык для написания кода разметки (такого как xml и HTML), который может быть непосредственно встроен в код C/C++. Вот простая выборка, записанная на этом языке, я называю это WDI (Интерфейс веб-разработки):

 /*
  * Simple wdi/html sample source code
  */
 #include <mySite>

 string name = "myName";
 string toCapital(string str);

 html
 {
  head {
   title { mySiteTitle; }
   link(rel="stylesheet", href="style.css");
  }
  body(id="default") {
   // Page content wrapper
   div(id="wrapper", class="some_class") {
    h1 { "Hello, " + toCapital(name) + "!"; }

    // Lists post
    ul(id="post_list") {
     for(post in posts) {
      li { a(href=post.getID()) { post.tilte; } }
     }
    }
   }
  }
 }

В основном это - измененный источник C с удобным для пользователя интерфейсом для HTML. Поскольку Вы видите, что традиционным основанным на теге стилем заменяют подобные C команды с блоками, разграниченными фигурными скобками. Я должен создать интерпретатор, чтобы перевести этот код в HTML и сзади вставить его в C, так, чтобы он мог быть скомпилирован. Часть C остается неповрежденной. В wdi источнике не необходимо использовать печать, каждый оператор возврата будет использоваться для вывода (в функции printf). Вывод программы будет чистым HTML-кодом.

Так, например, заголовок 1 тега был бы преобразован как это:

h1 { "Hello, " + toCapital(name) + "!"; }
// would become:
printf("<h1>Hello, %s!</h1>", toCapital(name));

Моя главная цель состоит в том, чтобы создать интерпретатор для перевода wdi источника в HTML как это:

tag(attributes) {content} => <tag attributes>content</tag>

Во-вторых, HTML-код, возвращенный интерпретатором, должен быть вставлен в код C с printfs. Переменные и функции, которые происходят внутри wdi, должны также быть отсортированы для использования их в качестве printf параметры (случай toCapital (имя) в демонстрационном источнике).

Я ищу эффективный (я хочу создать быстрый синтаксический анализатор), способ создать лексический анализатор и синтаксический анализатор для wdi. Уже испытанный гибкий провод и бизон, но поскольку я не уверен, являются ли они лучшими инструментами. Есть ли какие-либо хорошие альтернативы? Что лучший способ состоит в том, чтобы создать такой интерпретатор? Можно ли советовать, чтобы некоторые информировали литературу по этой проблеме?

8
задан metamorphosis 22 July 2018 в 09:32
поделиться

4 ответа

Если вы действительно серьезно относитесь к этому, то вы хотите модифицировать существующий парсер языка C. Edison Design Group C Front End может быть вариантом, хотя он действительно хочет быть просто C (C++) front end.

Другим вариантом является наш DMS Software Reengineering Toolkit. DMS можно получить с C Front End, который содержит полный синтаксический анализатор на языке C, полностью управляемый грамматикой.

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

1
ответ дан 5 December 2019 в 22:16
поделиться

bison / flex или yacc / lex - традиционный способ сделать это. ИМХО, лучше всего подходит для поставленной задачи.

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

Лучше делать это правильно. Скорее всего, синтаксический анализатор, созданный yacc / bison, будет намного чище (и быстрее), чем какой-нибудь ручной рекурсивный синтаксический анализатор по убыванию.

3
ответ дан 5 December 2019 в 22:16
поделиться

Могу я предложить это руководство: http://www.icemanind.com

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

1
ответ дан 5 December 2019 в 22:16
поделиться

Boost Spirit может быть лучше, чем bison / flex для таких целей.

1
ответ дан 5 December 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: