木质化/解析器

提供一个基于正则表达式的解析器。

dev-master 2022-07-29 11:21 UTC

This package is auto-updated.

Last update: 2024-08-29 06:01:58 UTC


README

将字符串转换为抽象语法树,并将抽象语法树转换为字符串。

安装

安装此库的推荐方法是通过composer

composer require xylemical/parser

用法

标记化器

标记化器的主要用法是

<?php

use Xylemical\Parser\Tokenizer;
use Xylemical\Parser\Parser;

$tokenizer = (new Tokenizer())->setPatterns([
  'word' => '\w+',
  'whitespace' => '[ \t]+',
]);

$result = $tokenizer->tokenize('This is a test scenario');

优化

优化允许通过优化来更好地对标记进行分类。

例如,一种编程语言指定关键字为[a-zA-z]+正则表达式模式,但个别标记为ifthen等。通过指定keyword标记的优化,它将自动转换这些标记,当没有优化模式匹配时,默认回退到keyword

<?php

use Xylemical\Parser\Tokenizer;

$tokenizer = (new Tokenizer())->setPatterns([
  'word' => '\w+',
  'whitespace' => '[ \t]+',
])->setRefinements('word', [
    'keyword' => '^[a-z]+$',
  ])->setRefinements('keyword', [
    'if' => 'if',
    'then' => 'then',
  ]);

$stream = $tokenizer->tokenize('if this1 then that');

// The stream would have the following tokens:
// * Token('if', 'if', 1, 1)
// * Token('whitespace', ' ', 1, 3)
// * Token('word', 'this1', 1, 4)
// * Token('whitespace', ' ', 1, 9)
// * Token('then', 'then', 1, 10)
// * Token('whitespace', ' ', 1, 14)
// * Token('keyword', 'that', 1, 15)

标记化器的子类

通过子类化标记化器可以定义默认标记和优化。

<?php

namespace Example;

use Xylemical\Parser\Tokenizer as BaseTokenizer;

class Tokenizer extends BaseTokenizer {

  protected const PATTERNS = [
    'word' => '\w+',
    'number' => '-?\d+(?\.\d+)',
  ];

  protected const REFINEMENTS = [
    'number' => [
      'float' => '^-?\d+\.\d+$',
    ],
  ];

}

词法分析器


词法分析器的子类

子类化词法分析器对于从标记化器生成的TokenStream中生成内容非常重要。

例如,以下词法分析器在发现word标记时,会生成wordword|number|float对。

<?php
namespace Example;

use Xylemical\Parser\Lexer as BaseLexer;

class Lexer extends BaseLexer {

  public function generate(TokenStream $stream): mixed {
    if ($stream->is('word')) {
      $word = $stream->expect('word');
      $stream->expect('equals');
      $result = $stream->expectOneOf(['word', 'number', 'float']);
      return [$word, $result];
    }
    return NULL;
  }

}

许可证

MIT,见LICENSE。