Как превратить маркерный поток в [закрытое] дерево синтаксического анализа

Почему вы создаете новые страницы только для благодарности. Я предлагаю вам создать новую страницу ("/thanks.php"), на которой вы можете динамически передавать электронную почту следующим образом.

            <?php
            if(isset(

Почему вы создаете новые страницы только для благодарности. Я предлагаю вам создать новую страницу ("/thanks.php"), на которой вы можете динамически передавать электронную почту следующим образом.

[110]POST['submit'])) { $email =

Почему вы создаете новые страницы только для благодарности. Я предлагаю вам создать новую страницу ("/thanks.php"), на которой вы можете динамически передавать электронную почту следующим образом.

[110]POST['email']; echo "<html><head><title>Thanks!</title></head> <body> <p>$email</p> </body> </html>" ; }
5
задан Brian Tompsett - 汤莱恩 27 June 2016 в 15:16
поделиться

3 ответа

Я действительно рекомендовал бы http://www.antlr.org/ и конечно классическую книгу Компиляторов Дракона.

Для легкого языка как JavaScript не трудно вручить списку синтаксический анализатор с рекурсивным спуском, но почти всегда легче использовать инструмент как yacc или antlr.

Я думаю для отстранения к основам вопроса, Вы действительно хотите учиться на синтаксисе грамматики BNF-esque и выбрать синтаксис для Вашей цели. Если у Вас есть это, дерево синтаксического анализа должно отсортировать, выпадают, будучи проявлением 'экземпляра' той грамматики.

Кроме того, не пытайтесь превратить создание своего дерева синтаксического анализа в Ваше конечное решение (как генерирование кода или этажерки). Это могло бы казаться выполнимым и более эффективным; но неизменно там прибудет время, когда Вам действительно жаль, что у Вас не было того дерева синтаксического анализа, 'как' кладет вокруг.

4
ответ дан 14 December 2019 в 13:49
поделиться

Необходимо исследовать инструменты парсера-генератора для платформы. Парсер-генератор позволяет Вам указывать контекстно-свободную грамматику для своего языка. Язык состоит из многих правил, которые "уменьшают" серию символов в новый символ. Можно обычно также указывать приоритет и ассоциативность для различных правил устранить неоднозначность на языке. Например, очень простой язык калькулятора мог бы выглядеть примерно так:

%left PLUS, MINUS           # low precedence, evaluated left-to-right
%left TIMES, DIV            # high precedence, left-to-right

expr ::= INT
| expr PLUS expr
| expr MINUS expr
| expr TIMES expr
| expr DIV expr
| LEFT_PAREN expr RIGHT_PAREN

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

Большинство парсеров-генераторов является конкретным языком. ANTLR известен и поддерживает C, C++, Objective C, Java и Python. Я услышал, что трудно использовать все же. Я использовал бизона для C/C++, КУБОК для Java и ocamlyacc для OCaml, и они все довольно хороши. Если Вы уже используете генератор лексического анализатора, необходимо искать парсер-генератор, который специфически совместим с ним.

2
ответ дан 14 December 2019 в 13:49
поделиться

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

0
ответ дан 14 December 2019 в 13:49
поделиться
Другие вопросы по тегам:

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