ホームページ >バックエンド開発 >PHPチュートリアル >PHPを使用して簡単なインタープリタを作成する方法

PHPを使用して簡単なインタープリタを作成する方法

不言
不言オリジナル
2018-07-11 14:17:192313ブラウズ

この記事では、主に PHP を使用して簡単なインタプリタを作成する方法を紹介します。これには一定の参考価値があります。今、みんなに共有します。必要な友人はそれを参照できます。

たまたまサークル内で友人 「2 週間の自作スクリプト言語」という本を読んでいる人を見つけて、言語自体をより深く理解するためにスクリプト言語を作成するのが良いだろうと思いました。ということで購入して見てみましたが、文章は分かりやすかったのですが、使用言語がJavaなのが不便でした、言語としてはPHPが最適でしょうか? Java を使用する理由。

ここ数日、私もインターネットでいくつかの情報を検索しましたが、これが良いと思いました。 https://github.com/rspivak/ls... ただし、繰り返しますが、このチュートリアルでは PHP を使用しません。著者が言ったように、どの言語を選択するかはあなた次第であり、通訳者は言語の機能に依存しません。

そこで、パート 1 を PHP で書き直しました。今後数日以内に、すべてのパートを PHP で書き直すつもりです。

ここにコードを書いて、あなた自身の検索を容易にしてください。また、インタープリターに興味のある友達が一緒に学んでくれることを願っています。

<?php class Token{
    private $type;
    private $value;
    public function __construct($type,$value)
    {
        $this->type=$type;
        $this->value=$value;
    }
    
    public function __get($name)
    {
        return $this->{$name};
    }
    
    public function __toString()
    {
        return 'type:'.$this->type.' value:'.$this->value;
    }
}

class Interpreter{
    private $current_char ;
    private $current_token ;
    private $text;
    private $pos=0;
    public function __construct($text){
        $this->text=trim($text);
    }
    
    public function error()
    {
        throw('Error parsing input');
    }
    
    public function get_next_token()
    {
        $text=$this->text;
        if ($this->pos > strlen($text)-1){
            return new Token('EOF', null);
        }
        
        $this->current_char = $text[$this->pos];
        if (is_numeric($this->current_char)){
            $token=new Token('INTEGER',intval($this->current_char));
            $this->pos++;
            return $token;
        }
        
        if ($this->current_char=="+"){
            $token = new Token('PLUS', $this->current_char);
            $this->pos ++;
            return $token;
        }
        $this->error();
    }
    
    public function eat($token_type)
    {
        if ($this->current_token->type==$token_type){
            $this->current_token=$this->get_next_token();
        }else{
            $this->error();
        }
    }
    
    
    public function expr()
    {
        $this->current_token=$this->get_next_token();
        $left=$this->current_token;
        $this->eat('INTEGER');
        $op=$this->current_token;
        $this->eat('PLUS');
        $right=$this->current_token;
        $this->eat('INTEGER');
        $result=$left->value+$right->value;
        return $result;
    }
}

do{
    fwrite(STDOUT,'xav>');;
    $input=fgets(STDIN);
    $Interpreter=new Interpreter($input);
    echo $Interpreter->expr();
    unset($Interpreter);
    
}while(true);

PHPを使用して簡単なインタープリタを作成する方法

現在は 1 桁の整数の加算のみをサポートしています

上記がこの記事の全内容です。皆様のお役に立てれば幸いです。学習、その他の関連コンテンツ PHP 中国語 Web サイトにご注意ください。

関連する推奨事項:

thinkphp3.2.3 単体テストに think-phpunit を使用する方法の概要

以上がPHPを使用して簡単なインタープリタを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。