Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

Der nachfolgende Code stellt einen Beispiel-Lexer dar, welcher eine Zeichenkette in die entsprechenden Symbole zerlegt, auswertet und das Ergebnis bereitstellt.

Codeblock
languagephp
themeRDark
use Brandbox\Framework\Brandbox\Lexer;

class CustomLexer extends Lexer\LexerAbstract
{
	public string $identifier;

	public string|bool $parameter1;
	public string|bool $parameter2;

	protected function getApplicableTokens(): array
	{
		return [
            Lexer\Lib\Token\CommaToken::class, 
            Lexer\Lib\Token\EqualToken::class,
            Lexer\Lib\Token\BooleanToken::class,
            Lexer\Lib\Token\IdentifierToken::class,
			Lexer\Lib\Token\OpenParenthesisToken::class,
            Lexer\Lib\Token\CloseParenthesisToken::class,
            Lexer\Lib\Token\DoubleQuotedStringToken::class, 
		];
	}

	protected function parse(): void
	{
		$this->identifier = $this
			->match(Lexer\Lib\Token\IdentifierToken::class)
			->get()
		;

		$this->match(Lexer\Lib\Token\OpenParenthesisToken::class);

		$next = $this->glimpse();

		if($next instanceof Lexer\Lib\Token\DoubleQuotedStringToken) {
			$this->parameter1 = $this
				->match(Lexer\Lib\Token\DoubleQuotedStringToken:class)
				->get()
			;
		} elseif($next instanceof Lexer\Lib\Token\BooleanToken) {
			$this->parameter1 = $this
				->match(Lexer\Lib\Token\BooleanToken:class)
				->get()
			;
		}

		$this->match(Lexer\Lib\Token\CommaToken::class);

 		$next = $this->glimpse();

		if($next instanceof Lexer\Lib\Token\DoubleQuotedStringToken) {
			$this->parameter2 = $this
				->match(Lexer\Lib\Token\DoubleQuotedStringToken:class)
				->get()
			;
		} elseif($next instanceof Lexer\Lib\Token\BooleanToken) {
			$this->parameter2 = $this
				->match(Lexer\Lib\Token\BooleanToken:class)
				->get()
			;
		} 

		$this->match(Lexer\Lib\Token\CloseParenthesisToken::class);
	}
}

$lexer = new CustomLexer();

$lexer->process('Something(false, "strange")');

// Inhalt von $lexer
// $lexer->identifier = 'Something'
// $lexer->parameter1 = false
// $lexer->parameter2 = 'strange'

$lexer->process('"Inkorrekt"(Identifikator, true)'); // LexerException: could not parse ...

...