bison(yacc)学习笔记
来源:互联网 发布:淘宝宝贝怎么插图地图 编辑:程序博客网 时间:2024/06/18 15:24
看matz的streem项目时对其中bison解析语法的几个地方有些不懂, 上网搜了些资料, 把这些记录下来.
bison是啥就不多说了, 网上一搜一大堆. bison官方文档.
1.首先是这个用法
%union { node* nd; strm_id id;}%type <nd> program compstmt%type <nd> stmt expr condition block cond var primary primary0%type <nd> stmts args opt_args opt_block f_args map map_args bparam%type <nd> opt_else opt_elsif%type <id> identifier
解释:
Bison中默认将所有的语义值都定义为int类型,可以通过定义宏YYSTYPE来改变值的类型。如果有多个值类型,则需要通过在Bison声明中使用%union列举出所有的类型,然后为每个符号定义相对的类型,终结符使用%token,非终结符使用%type来定义。
使用 宏YYSTYPE 的例子如下:
union lvalue_t { double num; const char *name; point3d_t pt3d; point2d_t pt2d; shape_t shape; struct { point2d_t p[5]; size_t n; } coord; circuit_layout::boundary bc; size_t nblk;};#define YYSTYPE lvalue_t
2.还有是关于操作符优先级
%nonassoc op_LOWEST%left op_amper%left op_bar%left op_or%left op_and%nonassoc op_eq op_neq%left op_lt op_le op_gt op_ge%left op_plus op_minus%left op_mult op_div op_mod%right '!' '~'%token op_HIGHEST
解释:
%left ADD //左结合
%right NEG //右结合
%nonassoc OP //无结合,如果出现x op y则是语法错误
位于同一行操作符相同, 定义在后面的符号比定义在前面的符号具有更好的优先级, 如乘除法的优先级比加减法要高.
3.指定起始符号
%start Cap3DFile
解释:
默认认为语法规则中出现的第一个非终结符是开始符号,也可以通过%start symbol来明确指定。
4.
%pure-parser%parse-param {parser_state *p}%lex-param {p}%{int yylex(YYSTYPE *lval, parser_state *p);static void yyerror(parser_state *p, const char *s);%}
解释:
Bison解析通常不是一个可重入的程序,因为它使用静态分配的变量(yylval yylloc)与yylex进行通信。可以通过 %pure_parser
来指定希望解析器是可重入的。
默认情况下 yyparse() 函数是没有参数的, 可以通过%parse-param {param}
来传递参数, 调用的时候也是 yyparse(param)
的形式. %lex-param
是对 yylex() 函数增加参数.
参考: http://blog.163.com/zongyuan1987@126/blog/static/1316231562011120112136225/
http://blog.csdn.net/wz3118103/article/details/27635873
- bison(yacc)学习笔记
- flex&bison 学习笔记
- Flex/Lex&Bison/Yacc
- Yacc 和 Bison
- YACC(BISON)使用指南
- lex(flex)&yacc(bison)
- Lex+YACC or Flex+Bison
- Lex+YACC or Flex+Bison
- Lex+YACC or Flex+Bison
- Lex+Yacc or Flex+Bison
- FLEX&BISON学习笔记(一:语法)
- Bison笔记
- 经典yacc表达式计算器(来自bison手册)
- Lex和Yacc使用学习笔记(一)
- Lex和Yacc使用学习笔记(二)
- Yacc的学习笔记(一)
- yacc 学习
- FLEX&BISON学习笔记(二:分析calculator 1 )
- java 虚拟机
- dns欺骗
- 第六周项目四--阅读程序(成员函数、友元函数、一般函数)
- ORA-600 [krr_assemble_cv_3]错误
- Android学习问题:关于AlertDialog中自定义布局带有的EditText无法弹出键盘
- bison(yacc)学习笔记
- python httplib2的安装
- 自动布局教程(一)
- jQuery和CSS3超酷3D页面切换导航菜单插件
- 自动布局教程(二)
- 内部错误,试图在初始化前展开展开app常量 【第四次修正】
- Android Binder及参考资料
- 追逐自己的梦想----------辅助制作第三十三课:向仓库存入N个物品对象汇编实现代码
- Cocos2d-3.x_读取xml文件