У меня есть парсер, я бы хотел научиться правильно разбирать

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

$f56

означает, что следующие символы будут цвета #F56, До следующего $ с 3 шестнадцатеричным символом он использует этот цвет.

$i

Имею ввиду до следующего $z (закрывающий тег) текст выделен курсивом. Они являются другими однобуквенными тегами.

Так что в основном этот язык состоит из трехсимвольных шестнадцатеричных тегов для цвета и однобуквенных тегов.

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

3 ответа

Если вы знаете о antlr, вам может быть интересно изучить http://www.antlr.org/wiki/display/ANTLR3/ANTLR3JavaScriptTarget, который генерирует лексеры и парсеры javascript

Если вы установите целевой язык как JavaScript

грамматик Tg

grammar T;
options {
    language=JavaScript;
    [other options]
}
...
...

parser.html

<script type="text/javascript" src="lib/antlr3-all-min.js"></script>
<script type="text/javascript" src="TLexer.js"></script>
<script type="text/javascript" src="TParser.js"></script>
<script type="text/javascript" src="TWalker.js"></script>

<script type="text/javascript">
var input = "...what you want to feed into the parser...",
     cstream = new org.antlr.runtime.ANTLRStringStream(input),
     lexer = new TLexer(cstream),
     tstream = new org.antlr.runtime.CommonTokenStream(lexer),
     parser = new TParser(tstream),
     r = parser.entry_rule();

var nodes = new org.antlr.runtime.tree.CommonTreeNodeStream(r.getTree());
nodes.setTokenStream(tstream);
var walker = new TWalker(nodes);
walker.tree_entry_rule();
</script>

JavaScript: в Good Parts есть хороший пример кода простого парсера: http://oreilly.com/javascript/excerpts/javascript-good-parts/json.html. Этот пример увеличивает по одному символу за раз, отслеживая этот индекс, но вы также можете увеличить его на длину, скажем, соответствующего результата регулярного выражения перед курсором.

Если вы действительно хотите узнать о разборе, возьмите эту книгу: Компиляторы: Принципы, Методы и Инструменты или Книга Дракона. Он очень плотный, но предлагает наиболее полный анализ разбора.

Я слышал хорошие вещи об ANTLR (упомянутых выше), но не использовал его. Я использовал Бизона, который работал очень хорошо для определения грамматики.

Другие вопросы по тегам