%union:声明标识出的符号值可能拥有的所有C类型
即声明语法分析器中符号值的类型。
如下:
%union {
char *p_char;
SYMBOL *p_sym;
LINK *p_link;
VALUE *p_val;
STMT *p_stmt;
}
%token:通过%token将%union中的声明与特定的符号联系起来
通过放在< >中的联合类型的相应成员名字来确定每种语法符号使用的值类型。
eg: %token NUMBER
(记号NUMBER代表了输入中的数字;它通过符号值来保存具体的数值。)
如下:
%token
STRING // string constant %token
ICON // integer or long constant including '\t', etc. %token
FCON // floating-point constant %token
CHARCON // character constant %token
TYPE // int char long float double signed unsigned .....
%left:操作符左结合
%right:操作符右结合
%nonassoc:没有结合性的操作符
%type:声明非终结符的类型
如下:
%type
opt_expr string_const %type
type specifiers type_class_qual %type
struct_specifier enum_specifier %type
decl decl_list enumerator_list %type
statement compound_stmt opt_mapping .....
$$:指向左部符号--也就是冒号左边的符号--的值。
$1:指向右边第一个符号的值。
$2:指向右边第二个符号的值。
$3:指向右边第三个符号的值。
……………依此类推。。。
*如果没有显示的语义动作代码时,默认语义动作 $$ = $1;
*当左部符号与右部符号具有不同类型时,报错。
如下:
thing : A { $$=17; } B C
{ printf("%d",$2); }
;
$$ 表示thing的值;
$1 表示A的值;
$2 表示嵌入动作的值;
$3 表示B的值;
$4 表示C的值。
阅读(5720) | 评论(1) | 转发(0) |