lemon需要两个c文件:lemon.c和lempar.c。lemon.c可以编译生成可执行程序lemon,而lempar.c是lemon根据语法规则文件生成代码的模板。
终结符和非终结符
- 终结符(token):以字母、数字、下划线组成,并且以大写字母开头的字符串。一般全写为大写。
- 非终结符:以字母、数字、下划线组成,并且以小写字母开头的字符串。一般全写为小写。
冲突的解决:
移进-规约冲突:按移进解决
- 如果移进和规约缺乏优先次序信息,那么移进优先,并且报告解析冲突
- 如果移进的优先次序比规约的优先次序高,那么移进优先,并且不报告解析冲突
- 如果规约的优先次序比移进的优先次序高,那么规约优先,并且不报告解析冲突
- 如果移进的优先次序与右关联的优先次序相同,那么移进优先,并且不报告解析冲突
- 如果移进的优先次序与左关联的优先次序相同,那么规约优先,并且不报告解析冲突
- 其它情况,以移进优先,并且报告解析冲突
规约-规约冲突:按优先级高的解决
- 如果两个规约缺乏优先次序信息,那么以先出现在语法文件里的规则优先,并且报告解析冲突
- 如果存在两个两个规约都满足,那么以优先级高的规约解决争议,并且不报告解析冲突
- 其它情况,以先出现在语法文件的规则进行规约,并且报告解析冲突
指示符
- %destructor
- %extra_argument
- %include
- %left
- %name
- %nonassoc
- %parse_accept
- %parse_failure
- %right
- %stack_overflow
- %stack_size
- %start_symbol
- %syntax_error
- %token_destructor
- %token_prefix
- %token_type
- %type
分析器接口
- void *ParseAlloc(void *(*pAllocFunc)(size_t));
- void Parse(void *pParser, int hTokenID, PARSETOKENTYPE sTokenData, ParseARG_PDECL pArg);
- ParseTrace(FILE *stream, char *zPrefix);
- ParseFree(void *pParser, void (*pFreeFunc)(void *));