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);
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!