过滤介绍.
此工程包含处理的全部逻辑 在 EPCC 中过滤。本文件提供 介绍这个概念是如何运作的.
我们经常遇到的一个问题是,我们有一个字符串,想要把它归类为有效或无效. 例如,这里有些事情你可能关心弦:
- 字符串以大写字母开头 .
- 字符串是有效的电子邮件地址 .
- 是弦是平面(写出相同的前向和后向,像再生机,公民,雷达,水平)
- 字符串是一个有效的 Java 程序 .
可以使用不同的技术来检查上面的内容,包括直接写出代码和使用正则表达式. 但有些事情比较复杂,比如案例3和案例4.
如果是最后一个,你可能会定义一个语法,那就是一套规则,说一个有效的字符串是什么样子的。 一个共同的技术是分两个阶段进行:
- Lexing - 将字符串转换成被称作符号的东西块,每个符号代表了字符串的某个部分(例如,在java程序中,您可能为每个关键词有一个符号). 更多细节载于
lexer.js文件 - 解析 - 为检查出出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出自出 我们使用一个递归式的正方形解析器,这意味着每个语法规则都会调用一个功能来检查一个匹配,并可能递归调用其他函数.
我们试图分析的语法 在增强后背-瑙尔形式(https://www.rfc-editor.org/rfc/rfc5234 (中文(简体) ))如下:
(这种结构的一些方式是使代码更容易被读取)
root = or_expression eof
# Or support
or_expression = and_expression *( "|" and_expression )
# And support
and_expression = group_expression *( ":" group_expression )
and_expression =/ group_expression *( "," group_expression ) // Legacy chaining operator
# Parenthesis support
group_expression =/ search_term
group_expression =/ "(" or_expression ")"
search_term = binary_term
search_term =/ unary_term
search_term =/ vararg_term
binary_term = binary_operator "(" literal "," literal ")"
unary_term = unary_operator "(" literal ")"
# The code slightly deviates from this to handle weird cases for backwards compatability reasons, I hate
vararg_term = vararg_operator "(" literal "," literal *( "," literal ) ")"
# Everything below is largely handled as a function of the lexer
binary_operator = "eq" / "like" / "gt" / "ge " / "lt" / "le" / "text"
unary_operator = "is_null"
vararg_operator = "in"
; these literal represent standard unencoded literals.
literal = 1*(ALPHA / DIGIT / "$" / "-" / "_" / "*" / "." / " " / "{" / "}" / "@" / "|")
; we treat binary, unary & vararg operators as literals in cases where people want to do something like eq(foo, ne).
literal =/ binary_operator
literal =/ unary_operator
literal =/ vararg_operator
; 0x22 is a quotation mark
literal =/ 0x22 *string_characters 0x22
; there is probably a better way to write this in ABNF involving hex like 0x01-0x21 0x23-0x5B 0x5D-0x7E
string_character = any_character but not " or \
string_character =/ escape_sequence
escape_sequence = "\" 0x22
鼓励更多感兴趣的读者阅读: 域-特定语言,由Fowler编写,我们在此使用的两种技术是: (Regex Table Lexer p.239-244, Recursive Economic Parser p.245-255).
已发布软件包
https://www.npmjs.com/package/@elasticpath/epcc-search-ast-generator-js (中文(简体) )