2

javascript でテキストを解析したい。解析したい構文はマークアップ言語です。この言語には、主に 2 種類のマークアップがあります。

$f56

は、次の文字が色付きであることを意味します#F56。以下までは$3つのhex charでこの色を使用しています。

$i

$z次の(終了タグ)までは、テキストがイタリック体であることを意味します。その他一文字タグです。

つまり、基本的にこの言語は、色用の 3 文字のヘキサ タグと 1 文字のタグで構成されています。

文字の位置とタグの現在の状態 (フォーマットと色) を保存して、テキストを解析するために醜いものを作成することはできますが、適切な解析を学びたいと思います。この言語用のクリーンなパーサーを作成するためのヒント/原則をいくつか教えていただけますか?

4

3 に答える 3

2

antlrについて知っている場合は、javascript レクサーとパーサーを生成するhttp://www.antlr.org/wiki/display/ANTLR3/ANTLR3JavaScriptTargetを探索することに興味があるかもしれません。

対象言語を 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>
于 2012-06-28T15:26:16.937 に答える
1

JavaScript: Good Partsには、単純なパーサーの優れたサンプル コードがあります: http://oreilly.com/javascript/excerpts/javascript-good-parts/json.html。この例では、このインデックスを追跡しながら一度に 1 文字ずつインクリメントしますが、カーソルの前に一致する正規表現の結果などの長さだけインクリメントすることもできます。

于 2012-06-28T15:26:24.310 に答える
0

構文解析について本当に学びたい場合は、この本を手に取ってください: Compilers: Principles, Techniques, and Tools aka The Dragon book. これは非常に密度が高いですが、解析に関して最も完全な解釈を提供します。

ANTLR (上記) について良いことを聞いたことがありますが、使用したことはありません。私はBisonを使用しましたが、これは文法を定義するのに非常にうまく機能しました。

于 2012-06-28T16:44:19.567 に答える