120 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace nur\ldap\schemas;
 | |
| 
 | |
| use nur\b\ValueException;
 | |
| 
 | |
| class LseParser {
 | |
|   /** supprimer le {size} à la fin d'un OID */
 | |
|   protected static function fix_oid(string $oid): string {
 | |
|     return preg_replace('/\{\d+}$/', "", $oid);
 | |
|   }
 | |
| 
 | |
|   function __construct(?string $s=null) {
 | |
|     $this->s = $s;
 | |
|   }
 | |
| 
 | |
|   protected function expected(string $expected): ValueException {
 | |
|     return new ValueException("expected $expected, got $this->s");
 | |
|   }
 | |
|   protected function unexpected(string $value): ValueException {
 | |
|     return new ValueException("unexpected $value");
 | |
|   }
 | |
| 
 | |
|   protected $s;
 | |
| 
 | |
|   #~~~~
 | |
| 
 | |
|   const SPACES_PATTERN = '/^\s+/';
 | |
| 
 | |
|   protected function skipSpaces(): void {
 | |
|     if (preg_match(self::SPACES_PATTERN, $this->s, $ms)) {
 | |
|       $this->s = substr($this->s, strlen($ms[0]));
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   #~~~~
 | |
|   protected function isLiteral(string $literal): bool {
 | |
|     return substr($this->s, 0, strlen($literal)) === $literal;
 | |
|   }
 | |
| 
 | |
|   protected function skipLiteral(string $literal): void {
 | |
|     $pos = strlen($literal);
 | |
|     if (substr($this->s, 0, $pos) === $literal) {
 | |
|       $this->s = substr($this->s, $pos);
 | |
|     } else {
 | |
|       throw $this->expected($literal);
 | |
|     }
 | |
|     $this->skipSpaces();
 | |
|   }
 | |
| 
 | |
|   #~~~~
 | |
| 
 | |
|   const NAME_PATTERN = '/^\S+/';
 | |
| 
 | |
|   protected function isName(): bool {
 | |
|     if (!preg_match(self::NAME_PATTERN, $this->s, $ms)) return false;
 | |
|     $name = $ms[0];
 | |
|     return !in_array($name, ['(', ')', '$']);
 | |
|   }
 | |
| 
 | |
|   protected function parseName(): string {
 | |
|     if (!preg_match(self::NAME_PATTERN, $this->s, $ms)) {
 | |
|       throw $this->expected("<NAME>");
 | |
|     }
 | |
|     $name = $ms[0];
 | |
|     $this->s = substr($this->s, strlen($name));
 | |
|     $this->skipSpaces();
 | |
|     return $name;
 | |
|   }
 | |
|   
 | |
|   #~~~~
 | |
| 
 | |
|   const STRING_PATTERN = "/^'([^']*)'/";
 | |
| 
 | |
|   protected function isString(): bool {
 | |
|     return preg_match(self::STRING_PATTERN, $this->s, $ms);
 | |
|   }
 | |
| 
 | |
|   protected function parseString(): string {
 | |
|     if (!preg_match(self::STRING_PATTERN, $this->s, $ms)) {
 | |
|       throw $this->expected("<STRING>");
 | |
|     }
 | |
|     $this->s = substr($this->s, strlen($ms[0]));
 | |
|     $this->skipSpaces();
 | |
|     return $ms[1];
 | |
|   }
 | |
|   
 | |
|   #~~~~
 | |
| 
 | |
|   protected function parseNames(): array {
 | |
|     if ($this->isName()) return [$this->parseName()];
 | |
|     $names = [];
 | |
|     if ($this->isLiteral('(')) {
 | |
|       $this->skipLiteral('(');
 | |
|       while ($this->isName()) {
 | |
|         $names[] = $this->parseName();
 | |
|         if ($this->isLiteral('$')) $this->skipLiteral('$');
 | |
|       }
 | |
|       $this->skipLiteral(')');
 | |
|     } else {
 | |
|       $names[] = $this->parseName();
 | |
|     }
 | |
|     return $names;
 | |
|   }
 | |
| 
 | |
|   protected function parseStrings(): array {
 | |
|     if ($this->isString()) return [$this->parseString()];
 | |
|     $strings = [];
 | |
|     if ($this->isLiteral('(')) {
 | |
|       $this->skipLiteral('(');
 | |
|       while ($this->isString()) {
 | |
|         $strings[] = $this->parseString();
 | |
|       }
 | |
|       $this->skipLiteral(')');
 | |
|     } else {
 | |
|       $strings[] = $this->parseString();
 | |
|     }
 | |
|     return $strings;
 | |
|   }
 | |
| }
 |