Comment écrire un interpréteur simple en utilisant PHP

不言
Libérer: 2023-04-03 06:16:01
original
2298 Les gens l'ont consulté

Cet article présente principalement comment utiliser PHP pour écrire un interpréteur simple. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Par hasard, je l'ai trouvé dans. Dans le cercle d'amis, j'ai trouvé quelqu'un qui lisait le livre "Two Weeks of Self-Made Scripting Language" et j'ai pensé qu'il serait bien d'écrire un langage de script afin de mieux comprendre le langage lui-même. Alors, je l'ai acheté et j'y ai jeté un œil. L'écriture était assez simple à comprendre, mais l'inconvénient était que le langage utilisé était Java. PHP est-il le meilleur langage ? Pourquoi utiliser Java.

Ces derniers jours, j'ai également recherché des informations en ligne et j'ai trouvé que c'était bien. https://github.com/rspivak/ls..., mais encore une fois, ce tutoriel n'utilise pas PHP. Comme le dit l'auteur, c'est à vous de choisir la langue, et l'interprète ne dépend pas des caractéristiques de la langue.

J'ai donc réécrit la partie 1 en PHP, et dans les prochains jours, je réécrirai toutes les parties en PHP.

Écrivez le code ici pour faciliter votre propre recherche, et j'espère aussi que certains amis intéressés par l'interprète pourront apprendre ensemble.

<?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);
Copier après la connexion

Comment écrire un interpréteur simple en utilisant PHP

Actuellement, ne prend en charge que l'ajout d'entiers à un chiffre

Ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il vous sera utile à l'apprentissage de chacun, plus Veuillez faire attention au site Web PHP chinois pour le contenu connexe !

Recommandations associées :

Introduction à thinkphp3.2.3 sur la façon d'utiliser think-phpunit pour les tests unitaires

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal