2

我想用javascript解析文本。我要解析的语法是一种标记语言。这种语言有两种主要的标记:

$f56

表示以下字符将有颜色#F56。直到下面$带有 3 个十六进制字符,它才使用这种颜色。

$i

表示直到以下$z(结束标记)文本为斜体。它们是另一种字母标签。

所以基本上这种语言由 3 个字符长的颜色标签和一个字母长的标签组成。

我可以制作一些难看的东西来解析我的文本,存储字符位置和标签的当前状态(格式和颜色),但我想学习正确的解析。你能给我一些提示/原则来为这种语言制作一个干净的解析器吗?

4

3 回答 3

2

如果您了解antlr,您可能有兴趣探索http://www.antlr.org/wiki/display/ANTLR3/ANTLR3JavaScriptTarget,它会生成 javascript 词法分析器和解析器

如果您将目标语言设置为 JavaScript

语法 Tg

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

解析器.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>
于 2012-06-28T15:26:16.937 回答
1

JavaScript: The Good Parts有一些很好的简单解析器示例代码:http: //oreilly.com/javascript/excerpts/javascript-good-parts/json.html。该示例一次增加一个字符,跟踪该索引,但您也可以增加光标前匹配正则表达式结果的长度。

于 2012-06-28T15:26:24.310 回答
0

如果您真的想了解解析,请阅读这本书:编译器:原理、技术和工具,又名 The Dragon 书。它非常密集,但提供了最完整的解析。

我听说过关于 ANTLR(上面提到过)的好消息,但没有使用它。不过,我使用过Bison,它对我定义语法非常有效。

于 2012-06-28T16:44:19.567 回答