视频推荐
- 1、西安交大老师讲解《编译原理》课程-第54讲[29:06]
- 2、西安交大老师讲解《编译原理》课程-第25讲[42:18]
- 3、西安交大老师讲解《编译原理》课程-第14讲[43:48]
- 4、西安交大老师讲解《编译原理》课程-第23讲[35:31]
步骤/方法
作者:pixelcao,腾讯 IEG 后台开发工程师
一、引子
最近的工作需要用表达式做一些参数的配置,然后发现大脑一片空白,在 Google 里试了几个关键词(起初搜了下“符号引擎”,发现根本不是我想要的)之后,明白过来自己应该是需要补一些编译原理的知识了。在掉了两晚上头发之后,决定整理一下自己的知识网络。
要解析的表达式大概长这个样子:
avg(teams
3.3 词法分析器
lexer 我们选择自己用 golang 编写。lexer 的基本功能是通过一个 buffer reader 不断读取文本,然后告诉 goyacc 遇到的是什么符号。
Lex 函数的返回值类型(即词法分析器的实际产物)需要在后面的 yacc 文件的 token 部分定义。
为了与 goyacc 结合,我们需要定义和实现以下接口:
type Scanner struct { buf *bufio.Reader data interface{} err error debug bool}func NewScanner(r io.Reader, debug bool) *Scanner { return &Scanner{ buf: bufio.NewReader(r), debug: debug, }}func (sc *Scanner) Error(s string) { fmt.Printf(&34;, jsonobj) jsonStr, _ := json.Marshal(jsonobj) fmt.Printf(string(jsonStr))}
四、参考文献
- 编译原理(基础篇)
- golang 实现自定义语言的基础
- 什么是 NFA 和 DFA
- 从 antlr 扯淡到一点点编译原理
- How to Write a Parser in Go