表現の構文解析:どのようにtokenize()
-
23-08-2019 - |
質問
また、tokenize()Java/Javascriptのような表現のJavascriptコードです。私が入力される文字列を含む表現を出力する必要の配列をトークン
どの練習って何かをするのはこのような態度を取るのか。いに対して繰り返し処理を実行する文字列では、正規表現がこれにしてもらえますか?
このリクエストに応じることがうれ:
- 番号や文字列リテラル(シングルとダブルの引用と引用脱出)
- 基礎数理、論理演算子およびコンパレータ(+, -, *, /, !, といなくなるので、 <,>,等)
- ドット、ブラケット記法のためのオブジェクトのアクセスと再帰(foo.バー,foo['bar'],foo[2][プロップ])
- 括弧とのネスト
- Ternaryオペレーター(foo?バー:'baz')
- 関数呼び出し(foo(bar))
私の具体的を避けるために使用 eval()
または何かの並べ替えのためのセキュリティ上の理由にその他、 eval()
なtokenize()の発現は私にとってます。
解決
学習を書く再帰的-系パーサです。ご理解の概念に行うことができるので他の言語:Java、C++、JavaScript、SystemVerilog,...などを実行します。場合に処理することができます文字列をそのまま解析.
再帰的-系の構文解析の基本技術の構文解析ることが義務付けられているコードです。これは便利かない場合にはアクセス(又は行わないまで抜かり)のパーサジェネレータ。
を再帰降のパーサで、毎するルール文法の結果、以下のように表示される手順を解析します。が必要な場合ご参照その他の規範を、この限りではありませんの呼び出して、そのようだ。
簡単な例:表現の関数を加算(このは演算子の優先順位).第一に、文法:
expr ::= term | expr "+" term term ::= factor | term "*" factor factor ::= /[0-9/+ (I'm using a regexp here)
現在のパーサはその手段としては、;再帰降投げることができるのにたたずんでいます。そんJavaScriptを使用しないという人が多いのでこなかったも錆び面接確約でのご案内です】Java:
class Parser {
string str;
int idx; // index into string
Node parseExpr() throws ParseException
{
Node op1 = parseTerm();
Node op2;
while (idx < str.size() && str.charAt(idx) == '+') {
idx++;
op2 = parseTerm();
op1 = new AddNode(op1, op2);
}
return op1;
}
Node parseTerm() throws ParseException
{
Node op1 = parseFactor();
Node op2;
while (idx < str.size() && str.charAt(idx) == '*') {
idx++;
op2 = parseFactor();
op1 = new MultNode(op1, op2);
}
return op1;
}
Node parseFactor() throws ParseException
{
StringBuffer sb = new StringBuffer();
int old_idx = idx;
while (idx < str.size() && str.charAt(idx) >= '0' && str.charAt(idx) <= '9') {
sb.append(str.charAt(idx));
idx++;
}
if (idx == old_idx) {
throw new ParseException();
}
return new NumberNode(sb.toString());
}
}
きの各文法のルール変換手順.まだ試こ;そのための運動はます。
また心配をする必要がエラーの検出を行います。現実世界のコンパイラの回収する必要から構文解析エラーをして構文解析、残りの入力します。ワイパーザはこのようなないけるようなことをする必要の回復がな必要性を認識できるようになる構文解析エラーが存在するとフラグです。最も簡単な方法ならこの言語では例外をスローする、このエントリポイントのパーサです。ん検出可能な解析に誤りが私の例です。
詳細ていない商品については、"LLパーサー"および"再帰降下パーサー"をわかりやすい。この点については、さを理解することができるの概念につ、彼らはそれを簡単に比べ、コLALR(1)中国国家機構の閉鎖しい影響を与える重要な書パーサは小型のタスク言語として初歩的な文字列。をお楽しみます。
他のヒント
はスピードが重要ではない、単純なレクサーのために、私は通常、トークンの種類ごとに正規表現を書いて、繰り返し入力の開始と順番にそれぞれ1と一致するようにしよう。それは1台のステートマシンに正規表現を組み合わせるので、(あなたはO(N ^ 2)のアルゴリズムで羽目になるしていないことを確認してください!)LEXのようなツールは、より効率的なレクサーが得られます。
あなたは字句解析器を実装する必要があります。あなたはそれを行うには JS / ccのを使用するかは、あなた自身による有限オートマトンを実装することができます。
、正式に、あなたが操作される言語は規則的であるので、あなたは正規表現を使用することができます。しかし、私はあなたにそれを推薦しません。
Althougth私が使用したことがないJS / ccで、私が最初にそれをしようとするだろうし、それが動作しない場合、私は自分自身で字句解析を構築しようとします。