nathanntg / lite-lexer
一个轻量级、相对较快的用于PHP的词法分析器。示例包括一个简单的查询语言。
0.1.0
2017-11-09 22:00 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 6.*
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