2012-06-28 6 views
2

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

$f56 

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

$i 

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

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

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

+1

Анализ увлекательный, и он включает в себя идеи, полученные из ядра вычислительной науки. Это большой вопрос. – Pointy

ответ

2

Если вы знаете о 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> 
1

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

0

Если вы действительно хотите узнать о разборе, возьмите эту книгу: Compilers: Principles, Techniques, and Tools aka Книга дракона. Он очень плотный, но предлагает наиболее полный анализ разбора.

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

 Смежные вопросы

  • Нет связанных вопросов^_^