* bexpr : rexp0 or expr0 depending on relative-mode setting
* rexp0 : rexp1 [ {||} rexp1...]
* rexp1 : rexp2 [ {^^} rexp2...]
* rexp2 : rexp3 [ {&&} rexp3...]
* rexp3 : expr0 [ {=,==,<>,!=,<,>,<=,>=} expr0 ]
* expr0 : expr1 [ {|} expr1...]
* expr1 : expr2 [ {^} expr2...]
* expr2 : expr3 [ {&} expr3...]
* expr3 : expr4 [ {<<,>>} expr4...]
* expr4 : expr5 [ {+,-} expr5...]
* expr5 : expr6 [ {*,/,%,//,%%} expr6...]
* expr6 : { ~,+,-,SEG } expr6
*| (bexpr)
*| symbol
*| $
*| number
*/
这些运算符号均有优先级别,而Nasm是通过递归来实现运算符号优先级的。具体参见代码。
代码注释:
/* * Unimportant cleanup is done to avoid confusing people who are trying * to debug real memory leaks */ /* * 释放 tempexprs 空间 */ void eval_cleanup(void) { while(ntempexprs) nasm_free(tempexprs[--ntempexprs]); nasm_free(tempexprs); }