本格的なレクサーなしで文字列をトークン化できる簡単な方法はありますか?
-
22-09-2019 - |
質問
私は実装しようとしています シャントヤードアルゴリズム, 、しかし、私は文字列をトークンに分割する最良の方法を把握するのにいくつかの助けが必要です。
気付いた場合、アルゴリズムの最初のステップは「トークンを読む」です。これはまさに自明ではないことではありません。トークンは、数字、オペレーター、パレンズで構成できます。
あなたが次のようなことをしている場合:
(5+1)
Simple String.split()は、トークンの配列を提供します{"("、 "5"、 "+"、 "1"、 ")}。
ただし、次のような複数の数字の数字がある場合、より複雑になります。
((2048*124) + 42)
これで、素朴なstring.split()はトリックを実行しません。複数桁の数字は問題です。
私はレクサーを書くことができることを知っていますが、本格的なレクサーを書くことなくこれを行う方法はありますか?
私はこれをJavaScriptに実装していますが、可能であればLexer-Pathを降りる必要を避けたいと思います。整数とともに、「*」、「+」、「 - 」、「/」オペレーターを使用します。
解決
正規表現はどうですか? Regexを簡単に記述して必要な方法で分割することができ、JS String.splitメソッドはRegexもパラメーターとして受け入れます。
たとえば...(必要なすべてのcharなどを含めるように変更)
/([0-9]+|[*+-\/()])/
他のヒント
説明されているように、グローバルマッチを使用できます http://mikesamuel.blogspot.com/2009/05/efficient-parsing-in-javascript.html
基本的に、トークンを説明する1つの正規表現を作成します
/[0-9]+|false|true|\(|\)/g
そして、それがグローバルに一致するように「g」を最後に置き、それからあなたはその一致方法を呼び出します
var tokens = myRegex.match(inputString);
そして、配列を取り戻します。