【问题标题】:I have a parser to make, i'd like to learn proper parsing我有一个解析器,我想学习正确的解析
【发布时间】:2012-06-30 03:44:01
【问题描述】:

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

$f56

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

$i

意思是直到下面的$z(结束标签)文本是斜体的。他们是另外一个字母 标签。

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

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

【问题讨论】:

  • 解析令人着迷,它涉及来自计算科学核心的思想。这是一个很大的话题。

标签: javascript parsing markup concept


【解决方案1】:

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

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

语法T.g

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>

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您真的想了解解析,请拿起这本书:Compilers: Principles, Techniques, and Tools aka The Dragon book。它非常密集,但提供了最完整的解析。

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

      【讨论】:

        猜你喜欢
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多