概要
- lemon程序是通过语法文件、模板文件lempar.c 生成C语言的语法解析函数。语法文件会被解析成模板的静态数据、参数。模板文件是语法解析函数模板,用来生成C语言版语法解析库
- tokenID 正整数 即某种类型 词的属性(标识符、整数、运算符、函数、…) 0表示分析结束
- tokenData 类型的实体(实例变量)
- tokenArg 语法环境(类型对应的参数个数、执行的方法、语法树等)
命令行参数
- b 省略非核心项目的报告
- g 不生成报告文件、在控制台显示
- q 不生成报告文件、也不显示
- c 不压缩动作表
- m 不生成终结符对应的整数头文件
- s 显示统计信息
- x 显示lemon的版本号
- D 宏 语法文件中可以包含 %ifdef 和 %ifndef %endif
生成的语法解析接口
- void* ParseAlloc(allocmemhandle) 解析器对象构造函数,需传入内存分配函数
- ParseFree(void*, freememhandle) 释放解析对象
- InitParserState(&tokenArg) 初始化语法环境
- Parse(void *parse, tokenID, tokenData, tokenArg) 语法解析
- ParseTrace(io, prefix) 语法分析日志流水
语法文件
| 语法 | 解释 | 例子 | | ————-|————————————–|————| |注释 | 与c语言保持一致 | | |限制 |每行最多一个表达式 | | |表达式 |其它:=其它 tokenID 其它 | | |tokenID | 第一个字母必须是大写的一串英文,可以有’_’ | | |其它符号 | 第一个字母必须是小写,可以有’_’ | | |. |一个语法结构结束 | | |{} |在结束符后可以跟c语言模块,当语法解析是会执行 | | |%left |tokenID左结合 |%left AND | |%right |tokenID右结合 |%right NOT | |%nonassoc |不能结合,即如果一个表达式出现两个不能计算 |%nonassoc EQ| |tokenID优先级|在语法文件中先出现的优先级低 | | |其它优先级 |等于表达从右到左最后一个tokenID的优先级 | | |其它优先级 |在结束符合C语音模块之间用[tonkenID]指定优先级| | |( |LPAREN | | |) |RPAREN | | |+ |PLUS | | |- |MINUS | | |\ |DIVIDE | | |* |TIMES | | |数值 |VALUE | | |$$ |指带其它符号类型的任意值 |{free($$)} | |%token_typ|指定tokenID,默认为void | | |%type |与%token_type相同的作用 | | |%default_type|为其它符号指定默认数据类型 | | |%destructor|定义其它符号的析构器 | | |%token_destructor|定义tokenID的析构器(公用) | | |%default_destructor|为其它符号指定默认析构器 | | |%include |导入C代码到语法分析器程序的前面,只能有一个 | | |%code |导入C代码到语法分析器程序的后面 | | |start_symbol|指定开始符号,默认是第一条 | | |extra_argument|指定Parse函数第四个参数 |%.. {Mtype *parg}| |%name |为生成的函数名添加前缀 | | |%token_prefix|为所有tokenID指定前缀 | | |%stack_size|指定语法分析最大堆栈,默认100个元素 | | |%stack_overflow|指定语法分析栈溢出时调用的C函数 | | |%syntax_error|指定语法错误时调用的C函数 | | |%parse_accept|指定语法正确分析完后调用的C函数 | | |%parse_failure|无法从错误恢复时调用指定函数获取错误信息| | |(anme) |申明类型变量、并起变量名,可用于C代码块 | | |:= |定义一个表达式 | |