📄 config.y
字号:
%union { char *str; int val; struct file_list *file; struct idlst *lst;}%token AND%token ANY%token ARGS%token AT%token BIO%token COMMA%token CONFIG%token CONTROLLER%token CPU%token CSR%token DEVICE%token DISK%token DRIVE%token DRQ%token DST%token DUMPS%token EQUALS%token FLAGS%token HZ%token IDENT%token INTERLEAVE%token IOMEM%token IOSIZ%token IRQ%token MACHINE%token MAJOR%token MASTER%token MAXUSERS%token MINOR%token MINUS%token NET%token NEXUS%token ON%token OPTIONS%token MAKEOPTIONS%token PORT%token PRIORITY%token PSEUDO_DEVICE%token ROOT%token SEMICOLON%token SEQUENTIAL%token SIZE%token SLAVE%token SWAP%token TIMEZONE%token TTY%token TRACE%token VECTOR%token <str> ID%token <val> NUMBER%token <val> FPNUMBER%type <str> Save_id%type <str> Opt_value%type <str> Dev%type <lst> Id_list%type <val> optional_size%type <val> optional_sflag%type <str> device_name%type <val> major_minor%type <val> arg_device_spec%type <val> root_device_spec%type <val> dump_device_spec%type <file> swap_device_spec%type <file> comp_device_spec%{/* * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)config.y 8.1 (Berkeley) 6/6/93 */#include "config.h"#include <ctype.h>#include <stdio.h>struct device cur;struct device *curp = 0;char *temp_id;char *val_id;%}%%Configuration: Many_specs = { verifysystemspecs(); } ;Many_specs: Many_specs Spec | /* lambda */ ;Spec: Device_spec SEMICOLON = { newdev(&cur); } | Config_spec SEMICOLON | TRACE SEMICOLON = { do_trace = !do_trace; } | SEMICOLON | error SEMICOLON ;Config_spec: MACHINE Save_id = { if (!strcmp($2, "vax")) { machine = MACHINE_VAX; machinename = "vax"; } else if (!strcmp($2, "tahoe")) { machine = MACHINE_TAHOE; machinename = "tahoe"; } else if (!strcmp($2, "hp300")) { machine = MACHINE_HP300; machinename = "hp300"; } else if (!strcmp($2, "i386")) { machine = MACHINE_I386; machinename = "i386"; } else if (!strcmp($2, "mips")) { machine = MACHINE_MIPS; machinename = "mips"; } else if (!strcmp($2, "pmax")) { machine = MACHINE_PMAX; machinename = "pmax"; } else if (!strcmp($2, "luna68k")) { machine = MACHINE_LUNA68K; machinename = "luna68k"; } else if (!strcmp($2, "news3400")) { machine = MACHINE_NEWS3400; machinename = "news3400"; } else yyerror("Unknown machine type"); } | CPU Save_id = { struct cputype *cp = (struct cputype *)malloc(sizeof (struct cputype)); cp->cpu_name = ns($2); cp->cpu_next = cputype; cputype = cp; free(temp_id); } | OPTIONS Opt_list | MAKEOPTIONS Mkopt_list | IDENT ID = { ident = ns($2); } | System_spec | HZ NUMBER = { hz = $2; }| TIMEZONE NUMBER = { zone = 60 * $2; check_tz(); } | TIMEZONE NUMBER DST NUMBER = { zone = 60 * $2; dst = $4; check_tz(); } | TIMEZONE NUMBER DST = { zone = 60 * $2; dst = 1; check_tz(); } | TIMEZONE FPNUMBER = { zone = $2; check_tz(); } | TIMEZONE FPNUMBER DST NUMBER = { zone = $2; dst = $4; check_tz(); } | TIMEZONE FPNUMBER DST = { zone = $2; dst = 1; check_tz(); } | TIMEZONE MINUS NUMBER = { zone = -60 * $3; check_tz(); } | TIMEZONE MINUS NUMBER DST NUMBER = { zone = -60 * $3; dst = $5; check_tz(); } | TIMEZONE MINUS NUMBER DST = { zone = -60 * $3; dst = 1; check_tz(); } | TIMEZONE MINUS FPNUMBER = { zone = -$3; check_tz(); } | TIMEZONE MINUS FPNUMBER DST NUMBER = { zone = -$3; dst = $5; check_tz(); } | TIMEZONE MINUS FPNUMBER DST = { zone = -$3; dst = 1; check_tz(); } | MAXUSERS NUMBER = { maxusers = $2; };System_spec: System_id System_parameter_list = { checksystemspec(*confp); } ; System_id: CONFIG Save_id = { mkconf($2); } ;System_parameter_list: System_parameter_list System_parameter | System_parameter ;System_parameter: swap_spec | root_spec | dump_spec | arg_spec ; swap_spec: SWAP optional_on swap_device_list ; swap_device_list: swap_device_list AND swap_device | swap_device ; swap_device: swap_device_spec optional_size optional_sflag = { mkswap(*confp, $1, $2, $3); } ;swap_device_spec: device_name = { struct file_list *fl = newflist(SWAPSPEC); if (eq($1, "generic")) fl->f_fn = $1; else { fl->f_swapdev = nametodev($1, 0, 'b'); fl->f_fn = devtoname(fl->f_swapdev); } $$ = fl; } | major_minor = { struct file_list *fl = newflist(SWAPSPEC); fl->f_swapdev = $1; fl->f_fn = devtoname($1); $$ = fl; } ;root_spec: ROOT optional_on root_device_spec = { struct file_list *fl = *confp; if (fl && fl->f_rootdev != NODEV) yyerror("extraneous root device specification"); else fl->f_rootdev = $3; } ;root_device_spec: device_name = { $$ = nametodev($1, 0, 'a'); } | major_minor ;dump_spec: DUMPS optional_on dump_device_spec = { struct file_list *fl = *confp; if (fl && fl->f_dumpdev != NODEV) yyerror("extraneous dump device specification"); else fl->f_dumpdev = $3; } ;dump_device_spec: device_name = { $$ = nametodev($1, 0, 'b'); } | major_minor ;arg_spec: ARGS optional_on arg_device_spec = { yyerror("arg device specification obsolete, ignored"); } ;arg_device_spec: device_name = { $$ = nametodev($1, 0, 'b'); } | major_minor ;major_minor: MAJOR NUMBER MINOR NUMBER = { $$ = makedev($2, $4); } ;optional_on: ON | /* empty */ ;optional_size: SIZE NUMBER = { $$ = $2; } | /* empty */ = { $$ = 0; } ;optional_sflag: SEQUENTIAL = { $$ = 2; } | /* empty */ = { $$ = 0; } ;device_name: Save_id = { $$ = $1; } | Save_id NUMBER = { char buf[80]; (void) sprintf(buf, "%s%d", $1, $2); $$ = ns(buf); free($1); } | Save_id NUMBER ID = { char buf[80]; (void) sprintf(buf, "%s%d%s", $1, $2, $3); $$ = ns(buf); free($1); } ;Opt_list: Opt_list COMMA Option | Option ;Option: Save_id = { struct opt *op = (struct opt *)malloc(sizeof (struct opt)); op->op_name = ns($1); op->op_next = opt; op->op_value = 0; opt = op; free(temp_id); } | Save_id EQUALS Opt_value = { struct opt *op = (struct opt *)malloc(sizeof (struct opt)); op->op_name = ns($1); op->op_next = opt; op->op_value = ns($3); opt = op; free(temp_id); free(val_id); } ;Opt_value: ID = { $$ = val_id = ns($1); } | NUMBER = { char nb[16]; (void) sprintf(nb, "%d", $1); $$ = val_id = ns(nb); } ;Save_id: ID = { $$ = temp_id = ns($1); } ;Mkopt_list: Mkopt_list COMMA Mkoption | Mkoption ;Mkoption: Save_id EQUALS Opt_value = { struct opt *op = (struct opt *)malloc(sizeof (struct opt)); op->op_name = ns($1); op->op_next = mkopt; op->op_value = ns($3); mkopt = op; free(temp_id); free(val_id); } ;Dev: ID = { $$ = ns($1); } ;Device_spec: DEVICE Dev_name Dev_info Int_spec = { cur.d_type = DEVICE; } | MASTER Dev_name Dev_info Int_spec = { cur.d_type = MASTER; } | DISK Dev_name Dev_info Int_spec = { cur.d_dk = 1; cur.d_type = DEVICE; } | CONTROLLER Dev_name Dev_info Int_spec = { cur.d_type = CONTROLLER; } | PSEUDO_DEVICE Init_dev Dev = { cur.d_name = $3; cur.d_type = PSEUDO_DEVICE; } | PSEUDO_DEVICE Init_dev Dev NUMBER = { cur.d_name = $3; cur.d_type = PSEUDO_DEVICE; cur.d_slave = $4; } | PSEUDO_DEVICE Dev_name Cdev_init Cdev_info = { if (!eq(cur.d_name, "cd")) yyerror("improper spec for pseudo-device"); seen_cd = 1; cur.d_type = DEVICE; verifycomp(*compp); };Cdev_init: /* lambda */ = { mkcomp(&cur); };Cdev_info: optional_on comp_device_list comp_option_list ;comp_device_list: comp_device_list AND comp_device | comp_device ;comp_device: comp_device_spec = { addcomp(*compp, $1); } ;comp_device_spec: device_name = { struct file_list *fl = newflist(COMPSPEC); fl->f_compdev = nametodev($1, 0, 'c'); fl->f_fn = devtoname(fl->f_compdev); $$ = fl; } | major_minor = { struct file_list *fl = newflist(COMPSPEC); fl->f_compdev = $1; fl->f_fn = devtoname($1); $$ = fl; } ;comp_option_list: comp_option_list comp_option | /* lambda */ ;comp_option: INTERLEAVE NUMBER = { cur.d_pri = $2; } | FLAGS NUMBER = { cur.d_flags = $2; };Dev_name: Init_dev Dev NUMBER = { cur.d_name = $2; if (eq($2, "mba")) seen_mba = 1; else if (eq($2, "uba")) seen_uba = 1; else if (eq($2, "vba")) seen_vba = 1; else if (eq($2, "isa")) seen_isa = 1; cur.d_unit = $3; };Init_dev: /* lambda */ = { init_dev(&cur); };Dev_info: Con_info Info_list | /* lambda */ ;Con_info: AT Dev NUMBER = { if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba")) { (void) sprintf(errbuf, "%s must be connected to a nexus", cur.d_name); yyerror(errbuf); } cur.d_conn = connect($2, $3); } | AT NEXUS NUMBER = { check_nexus(&cur, $3); cur.d_conn = TO_NEXUS; }; Info_list: Info_list Info
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -