Подсказки при разборе - PullRequest
0 голосов
/ 28 августа 2009

Я хочу реализовать минимальный язык шаблонов, такой как Template Toolkit, но гораздо более простой. Я не хочу использовать существующую реализацию / библиотеку, но начну с нуля, потому что я хочу извлечь из этого кое-что и полностью понять это, чтобы приспособить его к своим потребностям. Конечный продукт должен быть на C, но я, вероятно, сначала попытаюсь создать прототип на Perl. Для начала я хочу, чтобы он обрабатывал только другие файлы, подставляя переменные, а теперь - сложная часть, произвольно встраиваемая, если / elseif / else / endif-constructs, требующие некоторого расширенного анализа.

Вот пример, иллюстрирующий его предполагаемое использование:

<h1>[% substitute title %]</h1>
<p>
[% if foo %]
foo is true
[% elseif bar %]
[% if baz %]
bar and baz are true
[% endif %]
bar is true
[% else %]
<em>none<em> is true
[% endif %]
</p>

У меня приличный C и некоторые навыки Perl, но я абсолютно не разбираюсь в синтаксическом анализе, поэтому я даже не знаю, что именно ищу. Так что я был бы заинтересован в

  • какие алгоритмы могут обрабатывать синтаксический анализ следующим образом
  • чтение рекомендаций по таким алгоритмам, минимальное введение в парсинг, актуальное здесь, или учебные пособия
  • минимальные, хорошо документированные / прокомментированные примеры (я не мог иметь большого смысла из источника ТТ)

ТИА.

Ответы [ 3 ]

1 голос
/ 28 августа 2009

Если вы используете C, попробуйте (f) lex и yacc / bison. Они не так сложны в использовании.

Кроме того, есть несколько вопросов по основам компиляторов на SO.

Только основы:

Первый шаг - преобразование потока символов в поток токенов.

Например, [% и%] - это два токена. Но идентификатор также является токеном.

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

              [if]
             /  | \
            /   |  \
            |  Exp  |
            |   |   |
            |  foo  |
            |       |
      "foo is.."    elsif
                   / | \
                  /   |  \
                  |  Exp  |
                  |   |   |
                  |  bar  |
                  |       |
                  if      "none is true"
                /  | \
               /   |  \
               |  Exp  |
               |   |   |
               |  baz  |
               |       |
      "bar and..."    empty

И исполнить дерево. Что подразумевает: для каждого (еще) узла if вычисляют выражение и выполняют ветвь true, если true, и ветвь fase, если false.

0 голосов
/ 28 августа 2009

JavaCC - компилятор Java Compiler, предназначенный для создания компиляторов в Java. Весьма полезное программное обеспечение, если вы хотите создать язык программирования или переводчик.

0 голосов
/ 28 августа 2009

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

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