nathanntg/lite-lexer

一个轻量级、相对较快的用于PHP的词法分析器。示例包括一个简单的查询语言。

0.1.0 2017-11-09 22:00 UTC

This package is auto-updated.

Last update: 2024-09-29 04:43:02 UTC


README

一个基于PHP的轻量级字符串词法分析器。通过定义解析块,可以定义简单的语法。解析器将构建表示解析字符串的树。然后可以将其用于其他用途。

我创建这个是为了一个简单的查询语言来读取模型系统的自定义数据,但它可以轻松地适应其他语法。它的开销相对较低,并且根据我的测试,运行速度快(对于我的应用来说足够快)。

安装

此包可通过composer获取,并可以使用以下命令添加到项目中

$ composer require nathanntg/lite-lexer

使用方法

推荐的使用方法是扩展 LiteLexer\Parser 来定义自己的语法块(请参阅示例实现)。然后您可以按以下方式运行您的解析器

$parser = new MyParser();

// parse string
$tree = $parser->parseString($string_to_parse);

// optional: remove unneeded leaves and branches
$tree->prune();

// print debugging tree
$tree->debug();

示例实现

示例文件夹包含一个QueryParser类,该类实现了读取基本查询语言所需的解析器。具体来说,给定如下输入字符串

customer.namelast='' AND customer.namefirst = '' OR ( customer.namelast='' AND customer.namefirst='' )  ORDER customer.namelast DESC , customer.namelast   LIMIT 2

它将产生以下解析树

root
	query
		conditions_main
			condition_set_values
				conditions
					condition
						condition_standard
							column; raw "customer.namelast"; customer.namelast
							operator
								unnamed leaf; raw "="; =
							value
								value_string; raw "''";
				condition_operator
					unnamed leaf; raw "AND"; AND
				conditions
					condition
						condition_standard
							column; raw "customer.namefirst"; customer.namefirst
							operator
								unnamed leaf; raw "="; =
							value
								value_string; raw "''";
				condition_operator
					unnamed leaf; raw "OR"; OR
				conditions
					condition_set
						unnamed leaf; raw "("; (
						condition_set_values
							conditions
								condition
									condition_standard
										column; raw "customer.namelast"; customer.namelast
										operator
											unnamed leaf; raw "="; =
										value
											value_string; raw "''";
							condition_operator
								unnamed leaf; raw "AND"; AND
							conditions
								condition
									condition_standard
										column; raw "customer.namefirst"; customer.namefirst
										operator
											unnamed leaf; raw "="; =
										value
											value_string; raw "''";
						unnamed leaf; raw ")"; )
		order_by_main
			unnamed leaf; raw "ORDER"; ORDER
			order_by_columns
				order_by_column
					column; raw "customer.namelast"; customer.namelast
					order_by_direction
						unnamed leaf; raw "DESC"; DESC
				order_by_column
					column; raw "customer.namelast"; customer.namelast
		limit_main
			unnamed leaf; raw "LIMIT"; LIMIT
			limit_count; raw "2"; 2

测试

您可以使用以下命令运行PHPUnit测试(假设通过composer安装,并包含开发需求)

$ vendor/bin/phpunit tests