为了与MySQL数据库进行交互,我们唯一的方法是使用SQL语句。这是一个有力的,声明的声明-Type编程特定语言DSL。一开始,我们品尝了“甜味”,我们希望我们可以创建一种微语言,以便它可以分析某种类型的文档,或在提高发展效率的特殊业务。
例如,“创建”类似句子的句子迅速完成了元-group的检索。。
Scala提供了对Analyzer组合子的理解,使我们能够实现Scala System下的内部,简单域的特定语言或内部DSL。Scala具有一些可以轻松支持内部DSL开发的功能:函数Corride:隐藏的转换,允许使用,允许使用符号名称(这很重要),允许使用``空间更换对象等)的符号。
在阅读本章之前,您可能需要对无上下文的语法有基本的了解。简要介绍Scala解析器组合的使用后,我们将尝试制作一个解析器,将JSON格式的字符串支持到Scala相应的数据结构中。
公式是由条件和动作组成的指令,即条件 - 活动规则:条件-Action。它通常用于表达与因果关系的知识,其基本形式为p→q,或者如果p,则q。
终端是形式语言的基本符号,无法分解(或替换)较小的符号。例如,给定两个产生::的语法的语法
其中,可以使用符号,代表“等效”的含义。在语法中,可以用ASB或BA代替S,但是A和B不能将它们替换为其他符号。因此,A和B是终端。
可以替换的非末端符号。明显地,在上述语法中,s是非末端。在同一语法下,符号是终端或非末端符号。
形式语法可以简单地理解为一个组:(n,σ,p,s)。
从直观的形式来看,形式语法是由一系列规则或一系列“公式”或“模板”组成的标准。
显然,该语法描述了这样的字符串集合:BA,ABAB,AABABB等。因为我们可以从初始符号s开始,通过这样的派生过程:获取上述字符串。
形式语法的类型分为四种类型:无限的语法,上下文语法和背景与语法和形式语法无关。它们是在本章中提到的line部分。
其中,s代表主题,v代表谓词,o代表对象。根据现在的判断,这是一个无上下文 - 无上文的语法,因为左侧只有一个独立的非末端符号。
从初始符号中,我们可以得到以下句子:
{人们吃肉,世界上的雨,人们吃雨,世界上的肉,......}
以此为例,推导过程是:
显然,由于上下文无事可做,因此无需考虑诸如“移动客人”之类的因素。我们可以选择导致某些语义错误的S,V,O。
其中,People V和Tian V不再是一个单独的非终止符号。因为V和O的左侧都添加了有限的单词。例如,只有当主题是“人”时,谓词才能“吃”。
以“人吃”为例,派生过程是:
在第三步中,上面的V是“人”,因此可以通过衍生品启动。
在引入上下文与语法无关之后,我们尝试使用它来表达四个操作表达式,例如:...它的语法如下:
在这里,重复内部的内容。内部储备选项通过符号分开。在此示例中未提及,这意味着这是一个选项。
请注意,此表达式(expr)通过 *或 /操作通过 *或 /操作链接。这些单词是通过 *或 /操作链接的。该因子本身可以是floatingpointnumber或其他包含在括号中的表达式。
在“大因子”之间使用 + / - 操作,使用“小因素”之间的 *或 /操作,该因素定义了操作员的运行优先级。
算术表达的解析器包括在继承自我特征的类中。代币的含义是“符号”,因为该工具给出了许多基本解析器:标识符,字符串单词和数字以及其他parsersessencein在此示例中,该特征提供的浮动点数解析器。
语法的Scalas的实施:
以下是一些相关说明:
它是最常用的,用于顺序组合,解析器组合,例如,将和谐的分析结果安装到另一个模板类中,该类别也被命名和返回。因此,假设的结果是分析结果是将返回一个。注意这是一个特征性的内部模板类。当打印它时,它将得到它。
该语句最终将被编译并最终返回一个。模板类的语句在这里:
这样做的优点是,如果您使用的解析器组合,则可以使用一致的部分功能(或理解为模式匹配)来提取分析的分析结果。这涉及另一种解析器组合,我们在后续提及它文章。
让另一个程序继承继承,并在主函数中调用该方法,将其传递到您指定的初始符号和数学表达式字符串中:
分析完成后,该程序将输出,这意味着它已经成功地解析了第13个字符之前的第一个字符之前的位置。实际上,该字符串的长度为12,因此,换句话说,整个表达式已成功分析。
分析后,控制台将紧密遵循并打印分析结果(其使用不佳,我们首先不关心它)。如果表达式分析失败,它将打印并输出错误的原因。
这是一个解析器,识别Java格式的浮点数。正则表达解析器(正则表达解析器)。
以下单个对象演示了如何制作可以解析电子邮件格式的解析器:
任何字符串后的任何方法都会返回解析器。在同一时间,字符串内容将被视为正则表达式作为分析规则。LET尝试在主函数中分析邮箱:
该分辨率是成功的,表明正则表达式是正确的,解析器可以正常运行。此示例的继承是自我开发的。Scala的解析器组合是根据特征的继承关系以有序的方式组织的,这些关系包括在它。
它是特征的顶层,它定义了最常见的分析框架。下一个级别是它需要正则表达式以使解析器起作用。更具体的特征是它实现了一个解析器,该解析器可以识别定义的单词或语言符号由Java。
在本章中,我们尝试制作DIY JSON PARSER。首先给出JSON文本并尝试分析其结构:
在JSON中,每个对象(对象)使用一个包含一个,其中包含由成员组成的成员集合(成员),并且成员通过符号分开。每个对象由格式的关键值支付。IT被指定为字符串类型包含各种数据结构(值)的值。值可以包含另一个独立对象obj或一个array arr.Arn.mong,数组是值中包含的值的集合。添加,值值还包含字符串值,浮点值,“ null”,“ true”,“ false”。
以下是JSON分析的上下文:无关紧要:
完整的解析器代码块在下面也给出:其中,此处使用成员集合和值集(值)进行替换。值的值。
由于JSON也可以被视为包裹,其中包含大型OBJ值,因此我们选择值作为初始符号传输并分析:
该代码将成功运行,并且控制台将打印:
尽管该程序已成功地分析了JSON,但分析后我们没有任何后续操作,因此现在打印的字符串来自模板类。其输出的内容晦涩难懂,而且似乎没有实际意义。无论是程序员还是Scala程序,直接了解输出结果并不容易,都不容易。现在该处理它了。如果可以将JSON对象映射到Scala内部的数据格式中,那么处理数据的效率要高得多,这应该更自然:
我们要在此处引入另一个解析器组合:该符号已连接到另一个解析器后面的符号,并试图转换前者的输出结果。对于返回值,可以理解此步骤(前提是获得了正确的分析结果)。让我们尝试创建一个将字符串转换为浮点的解析器:
现在使用它来升级我们的JSON解析器的一部分。中间对应于JSON每个K-V的每个K-V键值的序列,其中K是类型。
在这里,我们使用部分功能来尝试消除多余的括号,分配结果,然后添加到映射中。
实际上,我们可以使用和优化代码。例如,以下写作:。在它们的左右,代表仅保留右解析器组合的操作结果(这样,分辨率结果已被放弃),这就是同样。因此,上述代码可能会变得更加紧凑:
此外,我们希望将JSON中的字符串转换为Scala中的相应数据结构。以其中一个为例,写作如下:
现在,我们将投资并升级我们以前的JSON解析器:
使用解析器分析以前的JSON字符串,我们将获得此结果:
显然,这样的结果更容易处理Scala程序,对于开发人员来说,它还可以直观地检查实际的分析效果。
常用的分辨率组合如下:
正则表达解析序列组合(正则表达式)顺序组合,但仅保留右/左求解器的结果。对于选项,可以选择多个替代方案。可以选择选择,并且分析成功地返回到某些,否则是在大多数情况下,无用的重复P和S进行了交流。转化P的分析并使用语法。
