首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

再探 Parser 和 Parser Combinator

于是,这个周末,我花了一个晚上,尝试了用 Rust 下 PEG 解析器 — pest 重新实现了 policy 表达式解析器部分,为了更好地对比 pest 和 Rust 下另外一个神器 nom 效果...PEG - Parsing Expression Grammar,是一种分析性形式文法,在 2004 年推出。它语法和 CFG - Context Free Grammar 很类似。...我们之前用 BNF 工具(比如 Flex/Bison)用于撰写解析 CFG。PEG 和 CFG 主要区别是:PEG 会在语法歧义发生时总选择第一个匹配项,而 CFG 则是未定义。...所以,PEG 总会只生成一棵满足规则语法树,而 CFG 有可能产生多棵,需要开发者手动消歧。...为了方便解析和生成合适语法树,pest 提供了一些方法可以控制哪些内容在语法树中生成: _{}:如果一条规则前加 _,意味着这个规则本身不会出现在语法(只出现其子规则)。

2.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

java编写简单语法分析预测程序

参考链接: 预测以下Java程序输出 编译原理课程,编了一个简单语法分析预测程序,这个程序时根据固定文法得到预测分析表,然后编写程序来判断表达式是否会正确推到出来。   ...    private StringBuffer tempBuffer;    //存放要输出字符串     private int ptr, row, col, step; //指针,预测表行...);         row=1;         ptr=0;         step=1;     }     public int column(char c) {  //判断预测表列...;         default:             return -1;         }     }     public int line(char c) { //判定预测表行...tmp);                 show("" + ctmp + "->" + tmp);             }         }     }      //过滤方法将打印字符串

60100

编译原理预测分析表自顶向下语法分析实现

递归下降 递归子程序方法思路:递归子程序法是一种确定自顶向下语法分析方法,要求文法是LL(1)文法。...它实现思想是对应文法每个非终结符编写一个递归过程,每个过程功能是识别由该非终结符推出串,当某非终结符产生式有多个候选式时能够按LL(1)形式唯一地确定选择某个候选式进行推导。...具体请看: 递归下降实现LL(1)文法分析C语言与Python实现 预测分析表 预测分析方法思路:预测分析法是一种表驱动方法,它由下推栈,预测分析表和控制程序组成。...实际上是一种下推自动机实现模型。预测分析关键为预测分析构建,即文法各非终结符first集和follow集求得。...预测分析法从开始符号开始,根据当前句型最左边非终结符和分析的当前符号,查预测分析表确定下一步推导所要选择产生式,最终得到输入串最左推导,完成输入串语法检查。 流程图 ?

1.8K30

jsqlparser:实现基于SQL语法分析SQL注入攻击检查

jsqlparser是一个javaSQL语句解析器,在上一篇博客:《jsqlparser:基于抽象语法树(AST)遍历SQL语句语法元素》介绍了如何通过jsqlparser来遍历SQL语句中所有的字段和表名引用...其实它可以用来进行更复杂工作,jsqlparser会将一条SQL语句各种语法元素以抽象语法树(AST,abstract syntax tree)形式解析为很多不同类型对象,通过对AST遍历就可以对...SQL语句进行分析。...SQL注入攻击分析实现 TablesNamesFinder是jsqlparser提供一个语法元素遍历对象,继承这个对象可以实现对需要语法元素访问,当遇到有注入攻击危险表达式,语句时抛出InjectionAttackException...(AST)注入攻击分析实现 这部分代码很少,实现禁用用UNION语句 import net.sf.jsqlparser.parser.CCJSqlParserDefaultVisitor; import

2.2K20

扒一扒基于词法分析语法分析SQL注入攻击检测

经过技术人员不懈努力,在多方调研和尝试后确立了在词法分析基础上再作了语法分析思路。...研究解决了包括输入数据编码多样性,词法分析需要考虑语句拼接以及语法分析要覆盖SQL庞大语法集在内各种技术难题,最后研发出了无规则基于词法分析语法分析SQL注入攻击检测与防御引擎——SQLChop...Mysql使用了yacc作为语法分析,具体实现,看mysql server代码就可以了。Mysql关键字token在sql/lex.h也有定义。...有了语法分析,我们再也不用关心各种变形了,编码多样性对语法分析器来说,已经无关紧要。因为我们使用是原生语法分析器,无论如何变形,只要语法分析器可以通过,那么他就是一条有效sql语句。...后言 SQLChop采用技术就是词法语法分析那一套,但是具体实现方案,并不清楚,以上只是个人对于基于词法语法分析SQL注入一些看法。

2.9K80

Python之父发文,将重构现有核心解析器

这篇文章分析了当前 pgen 解析器诸多缺陷,并介绍了 PEG 解析器优点,令人振奋。这项改造工作仍在进行,Guido 说他还会写更多相关文章。...)语法分析生成器(parser generator)(那个语法分析生成器,被称为“pgen”,是我为 Python 写下第一段代码)。...但是 expr 与 assignment 都能以 NAME 标记符开头,因此就会引起歧义(ambiguous),pgen 会拒绝我们语法。...(这也不完全正确,因为语法在技术上并不会导致歧义;但我们先不管它,因为我想不到更好词来表达。那么 pgen 是如何做决定呢?...我还有很多内容要写,关于 PEG 解析以及我具体实现,但是要等我整理好代码后,在后续文章再去写了。

98210

【计算理论】上下文无关语法 ( 语法组成 | 规则 | 语法 | 语法示例 | 约定简写形式 | 语法分析树 )

语法组成 II . 规则 III . 语法 IV . 语法示例 V . 语法简写形式 VI . 语法分析树 VII . 代数表达式 语法 I ....语法定义 : 从开始变元 , 使用规则逐步替换 , 替换到最后 , 将所有 终端字符组成字符串 放在一个集合 , 称为语法生成语言 ; L(G) = \{ w \in \Sigma^* : S \Rightarrow...语法分析树 ---- 语法分析树 : 字符串生成过程 , 可以写成语法分析树 ; 将上述 简写 约定语法描述 , 生成 终端字符构成字符串 ; 1 ....开始状态 : A , 使用 0A1 替换 A ; A \Rightarrow 0A1 当前语法分析树 : 2 ....使用 0A1 替换 A ; A \Rightarrow 0A1 \Rightarrow 00A11 当前语法分析树 : 3 .

2.1K10

Python 之父新发文,将替换现有解析器

这篇文章分析了当前 pgen 解析器诸多缺陷,并介绍了 PEG 解析器优点,令人振奋。这项改造工作仍在进行,Guido 说他还会写更多相关文章,我们就拭目以待吧。 ?...)语法分析生成器(parser generator)(那个语法分析生成器,被称为“pgen”,是我为 Python 写下第一段代码)。...但是 expr 与 assignment 都能以 NAME 标记符开头,因此就会引起歧义(ambiguous),pgen 会拒绝我们语法。...(这也不完全正确,因为语法在技术上并不会导致歧义;但我们先不管它,因为我想不到更好词来表达。那么 pgen 是如何做决定呢?...我还有很多内容要写,关于 PEG 解析以及我具体实现,但是要等我整理好代码后,在后续文章再去写了。----

1K30

编译原理词法分析程序c语言_编译器常用语法分析方法

引言 前面已经介绍了编译器预处理,词法分析,词法分析实现,也在其中说到了语法分析任务和过程。...语法分析输入是词法单元序列,然后根据语言文法表示(展开式),利用有限状态机理论,生成抽象语法树,然后遍历得到中间代码,即,三地址码。本节就以一个实验方式,来看一下,语法分析内在实现机制。...5.1实验描述 编制一个递归下降分析程序,实现对词法分析程序所提供单词序列语法检查和结构分析。 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。...当然在实际语法分析器要有错误恢复机制,以发现其他语法错误。即,一次报告多个语法错误。这里需要说明是,要想实现语法分析,必须先有词法分析,所以,这段代码包含了上一节内容,词法分析部分。...本小节内容只是进行状态分析。但对理解语法分析器有很大帮助。代码具体流程图,读者可自己画一下,其中味道,可意不可言…… 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

68820

用c语言手搓一个600行类c语言解释器: 给编程初学者解释器教程(5)- 语法分析2: tryC语法分析实现

用c语言手搓一个600行类c语言解释器: 给编程初学者解释器教程(5)- 语法分析2: tryC语法分析实现 用c语言手搓一个600行类c语言解释器: 给编程初学者解释器教程(1)- 目标和前言...600行类c语言解释器: 给编程初学者解释器教程(4)- 语法分析1:EBNF和递归下降文法 用c语言手搓一个600行类c语言解释器: 给编程初学者解释器教程(5)- 语法分析2: tryC语法分析实现...tryC语法分析 完整tryC EBNF文法: (这里我们用单引号包裹那些在BCNF文法定义中出现但又作为终结符出现字符) exp -> term { addop term } term ->...布尔表达式和算术表达式代码之前已经讲过了,这里看看statement实现,以及如何在语法分析同时解释执行: 这里使用方法是,对于流程控制语句,在语法分析时候就进行条件判断,如果if判断失败或者...while不进入循环块,就跳过该语句块不进行语法分析、解释执行; 其中RETURNFLAG用来表示在函数返回,跳过剩余语句;statement默认返回0,当有return语句在其中出现时才需要使用返回值

32530

【计算理论】上下文无关语法 CFG ( CFG 设计示例 | CFG 歧义性 | Chomsky 范式 | 上下文无关语法 转为 Chomsky 范式 )

语法歧义性 : 同样一个字符串 , 可以有不同语法分析树 ; ① 语法分析树 1 : 2 ....在上述 语法分析 , 加法优先级高于乘法 , 这是错误分析 ; ② 语法分析树 2 : 在上述 语法分析 , 乘法优先级高于加法 , 这是正确分析 ; 3 ....语法歧义分析 : 上述语法是无法区分 加法 和 乘法优先级 , 因此这里得到两个完全不一致得我语法分析树 , 那么该语法是有歧义 ; 4 ....: 这个语法分析树是唯一 , 没有其它形式 , 该语法是没有歧义 ; ③ 有歧义语法 : 在本节语法 , 无法区分 加法 和 乘法优先级 , 该语法是有歧义 ; 5 ....总结 : 如果语法歧义 , 那么中间字符串有歧义 ; 没有算法 可以判定 上下文无关语法 是否有歧义 ; 有些语法天生就是有歧义 , 但可以通过某种方法去掉语法歧义性 ; 三、Chomsky

1.1K20

Guarding:开源多语言架构守护工具

当然了,还有很多语法还在开发。 Guarding 可以很支持中文。但是,我觉得这中英文模板切换就是个问题。...基于 Ctags 语法分析。另外一种选择是使用在设计 Modeling 时候,引入是 Ctags。...基于 LSP 语法分析。我短暂评估过采用 LSP (Language Server Protocol )方式,但是使用 LSP 意味着:引入更多语言相关依赖。所以,依旧是不可行路线。...Guarding 使用是 Rust 语言开发,由于之前已经用过了 Lalrpop、Antlr 等解析器,所以这次我们采用解析器是:pest。...rule_level = { "package" | "class" | "struct" | "function" | "file" } 在 docs 和 examples 里,有 Guarding 语法开发过程记录和关键词信息

75020

如何设计领域特定语言,实现终极业务抽象?

语法分析分析符号流,得到语法树 语义分析分析语法树,得到新语法树 中间代码生成器,分析语法树,得到中间表示形式 …… 步骤 1~4,对于通用语言和领域特定语言来说都是极为类似的。...在 Guarding 设计是针对主流编程语言,所以在语法上会尽量与编程语言无关。 提取关键字、值、属性 在获得了用例作为输入条件之后,我们就需要从中提取一些关键信息,如关键字、值、属性等等。...在设计领域特定语言时,我们主要以实现领域中用例作为目标: 使用 DSL 描述一个用例 先不考虑语法实现,实现大部分用例 DSL 草稿版本 对齐不同用例 DSL 差异 考虑一些非常规用例,添加额外属性...解析器生成器 经典 Lex & Yacc 是你可以考虑范围,在不同语言里也有一些相似的实现。 对于我来说,以下是我常用一些解析器生成器。 Antlr。支持主流语言 Peg.js。...JavaScript Pest。Rust Lalrpop。Rust 我还是比较习惯用 Antlr,支持语言较多。

1.3K52

Python 之父撰文回忆:为什么要创造 pgen 解析器?

---- David Beazley 在 US PyCon 2018 上演讲,关于语法分析生成器(parser generators),提醒了我应该写一下关于它历史。...之所以我要写自己语法分析生成器,原因是当时这玩意(我熟悉)相当稀少——基本上就是用 Yacc(有个 GNU 重写版,叫作 Bison(译注:美洲野牛),但我不确定那时自己是否知道);或者是自己手写一个...我曾在大学里用过 Yacc,从“龙书”熟悉了它工作原理,但是出于某些原因,我并不喜欢它;IIRC 关于 LALR(1) 语法局限性,我很难解释清楚。...此外,我认为缩进格式很难教给词法分析器生成器。 (译注:1、这里生成器并非 Python 语法生成器,而是指用来生成分析工具。...Lex 是“LEXical compiler”简称,用来生成词法分析器;Yacc 是“Yet another compiler compiler”简称,用来生成语法分析器。

1.3K30

Python 之父解析器系列之六:给 PEG 语法添加动作

如果你在语法规则还可以添加(某些)语义,那么语法就会更好。特别是对于我正在构建 Python 解析器,我需要控制每个备选项返回 AST 节点,因为 AST 格式已经规定好。...【这是我 PEG 系列第 6 部分。...动作块代码通常与编写编译器语言相同,如 C 语言,增加一些工具,用于引用备选项条目。在 Python 原始 pgen ,我没有添加此功能,但对于这个新项目,我希望使用它。...,例如: rule: item item item { action 1 } | item item { action 2} 它会使语法分析器变得复杂,但可读性更重要,所以我会使用这种方式。...在 PEG 解析器,因为有无限回溯,我们有其它选择: 延迟所有动作,直到解析完所有内容。这对我目的没有用,因为我想在解析期间构造一个 AST。

53420

自然语言处理绪论1.词法分析歧义2.两类不同语言处理模型3.评测技术4.图灵实验5.学习姿势

1.词法分析歧义 自然语言处理歧义 分词歧义,作为自然语言处理第一个步骤。...词性标注 语法分析歧义 语义分析歧义 语用歧义 2.两类不同语言处理模型 2.1能力模型 基于语言学规则模型 建模步骤:...语言学知识形式化 形式化规则算法化 算法实现 2.2应用模型 根据不同语言处理应用而建立特定语言模型,通常是基于统计门票性。...又称为“经验主义” 语言模型 建模步骤: 通过大规模真是语料库,获取语言各级语言单位上统计信息 一句较低级语言单位上统计信息,运用相关统计推理新技术计算较高级语言单位上统计信息 统计与规则相结合方法...,取长补短 3.评测技术 著名国际评测: Sigham Conll TREC 4.图灵实验 一种确定计算机是否会思考实验.一个人向计算机发问,另一个不知情的人试图从回答中区分是人还是计算机

1.3K80

编译原理实战入门:用 JavaScript 写一个简单四则运算编译器(二)语法分析

四则运算语法规则(语法规则是分层) x* 表示 x 出现零次或多次 x | y 表示 x 或 y 将出现 ( ) 圆括号,用于语言构词分组 以下规则从左往右看,表示左边表达式还能继续往下细分成右边表达式...语法分析 对输入文本按照语法规则进行分析并确定其语法结构一种过程,称为语法分析。 一般语法分析输出为抽象语法树(AST)或语法分析树(parse tree)。...compileOp('*') *    |  |_ compileOp('+') +   |_ 有很多算法可用来构建语法分析树...递归下降分析法 递归下降分析法,也称为自顶向下分析法。按照语法规则一步步递归地分析 token 流,如果遇到非终结符,则继续往下分析,直到终结符为止。...this.output += op + '\r\n' }, //输出汇编代码 outputStr() { return this.output } } // 语法分析

84260
领券