的过程,这个过程一般比较简单,可以使用 lex, flex 之类的工具,也可以完全手写
语法解析时将 token 组合解析成语法树的过程,对于比较复杂的 dsl 设计,这个过程可能比较复杂,可以借助如 yacc...这样的工具,但是为了追求效率,也可以完全手写(promql 就是手写,如果是手写,没有太大必要把词解析和语法解析两者分割得太清楚)
执行我们只看即时执行的情况,一般来说可以对上一步的语法树直接执行,也可以做进一步编译...$3)
}
| expr2 '/' expr3
{
$$ = $1.Quo($1, $3)
}
expr3:
NUM
| '(' expr ')'
{
$$ = $2
}
实战:计算器...这个例子时上面的示例的完整版本,来自 go 官方, 本质是实现了一个大数的计算器,支持 "+", "-", "*", "/", "(", ")", 值得注意的是 expr 定义了几种,里面蕴含了优先级关系...the cell under the pointer is nonzero
代码在这里
我们除了 lexer.go parser.y 之外还写了一个 env.go, 这是执行使用的结构体,目的是优化和执行代码