私は現在、以下に基づいて式エバリュエーター(式のような単一行式)を実装しています。
- 入力された式は、リテラルブール、整数、小数、文字列、関数、識別子(変数)を分離するためにトークン化されます
- シャンティングヤードアルゴリズムを実装し(可変数の引数を持つ関数を処理するように少し変更)、括弧を取り除き、適切な優先順位で演算子を後置された順序で並べます
- 私のシャンティングヤードは、トークンの(シミュレートされた)キューを単に生成します(配列によって、Powerbuilder Classic言語はオブジェクトを定義できますが、ネイティブストレージとしてのみ動的配列を持ちます-真のリストではなく、ディクショナリーではありません)。シンプルなスタックマシン
私の評価者はうまく働いていますが、私はまだ足りないので、if()
どうすればいいのか迷っています。
私のシャンティングヤードのポストフィックスおよびスタックベースの評価if()
で、trueとfalseの部分を持つ別の関数として追加すると、1つif(true, msgbox("ok"), msgbox("not ok"))
で両方のメッセージが表示され、1つだけ表示したいとします。これは、関数を評価する必要がある場合、その引数はすべて評価済みでスタックに配置されているためです。
if()
怠惰な方法で実装する方法を教えてもらえますか?
私はこれらを一種のマクロとして処理することについて考えましたが、初期の段階ではまだ条件の評価ができていません。おそらく、キューとは別の種類の構造を使用して、条件とtrue / false式を別々に保持する必要があるのでしょうか?現時点では、式は評価前に解析されますが、将来の評価のために中間表現を一種のプリコンパイルされた式として保存することも計画しています。
編集:問題について少し後で、私は自分の式のツリー表現(線形トークンストリームの代わりにAST)を構築でき、そこから自分のの別のブランチを簡単に無視できると思いif()
ます。