1.SQL解析系列(golang)--goyacc实战
SQL解析系列(golang)--goyacc实战
Lex & Yacc简介
Lex & Yacc是电话电话用于生成词法分析器和语法分析器的工具,与GNU用户熟悉的号码号码Flex&Bison相对应。它们在编译器领域和DSL或SQL解析领域有广泛应用。源码源码
Lex用于生成词法分析器,电话电话将输入分割成有意义的号码号码知道源码如何修改词块(token)。
Yacc用于生成语法解析器,源码源码蘑菇博客源码确定token之间的电话电话关联。
词法分析器流程如下图所示。号码号码
词法分析器
词法分析器获取token流。源码源码通过调用yylex()读取输入并返回token,电话电话然后循环读取并返回解析好的号码号码token。每个token包含两部分:类型和值。源码源码
计算器词法分析器规则定义示例。电话电话茶马源码交易
语法分析器
语法分析器找出输入token之间的号码号码关系,使用巴科斯范式(BNF)书写规则。源码源码同样分为三部分,前两部分必须。金属力学指标源码
规则示例。
yacc语法规范整体结构
由三部分组成,包括规则定义和用户子程序。动作代码执行语法匹配时的岳阳和衡阳源码操作。如日期解析规则。
移进/归约过程
移进:读取token无法匹配规则时,将其压入堆栈并切换状态。归约:发现能匹配规则的token,将符号从堆栈取出并压入新符号。
处理表达式如fred = + 的示例。
解决冲突:通过指定优先级和结合性。
goyacc
goyacc是golang版的Yacc,生成符合输入语法规则文件的go语言解析器。yyParse要求词法分析器符合特定接口。
接口示例。
goyacc样例:电话号码解析源代码。
json解析器源代码。
参考文档链接。