⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myform.y

📁 sco unix 前台界面开发程序,采用UNIX中的词法分析器和语法分析器
💻 Y
字号:
%{#include <stdio.h>#include "screen.h"#include "myform.h"  #include "newtype.h" //#include "type.h"#undef ECHOstatic int NO; 	/*当前域*/static int LINENO;	/*行号*/static char BUF[80];	/*标签或默认值*/static int ROW,COL;	/*域起始行、列*/static int ROWS,COLS;	/*域每行、列尺寸*/static int INDEX;	/*活动域索引号*/static char *strptr;	/*用户指针*/  %}%start program%union {   int ival;   double dval;   char sval[80];   unsigned long chval;   int opval;}%token _begin  %token _end%token _form _label _field%token _position _name _size _type _default %token _index _box _back _fore _optson _optsoff _just%token _init _term _prompt _pagination _disp%token _type_amount _type_alpha _type_numeric%token _type_text _type_date _type_integer _type_list%token _type_ctext _type_etext _type_digit%token <ival> _digit%token <dval> _float%token <sval> _str _text%token <ival> _justify_center _no_justification _justify_left _justify_right%token <chval>_a_blink _a_bold _a_dim _a_reverse _a_standout _a_normal%token <chval>_a_underline _a_altcharset%token <opval>_o_visible _o_active _o_public _o_edit _o_wrap %token <opval>_o_blank _o_autoskip _o_nullok _o_passok _o_static%type <ival> justex just%type <chval> attr expr fore back%type <opval> opt optsex optson optsoff%left '|'   %left '&'   %left UMINUS%%program : formbeg formsec formendformbeg : _begin _form        {        	int i;        	NO = -1;			LINENO = 1;			HFORM=InitForm();        }		formsec : formsec formlist        | formlist                formlist: position		{			LINENO++;			HFORM->row = ROW;			HFORM->col = COL;		}		| size		{			LINENO++;			HFORM->rows =ROWS;			HFORM->cols =COLS;		}		| name		{			LINENO++;			HFORM->name = (char *) calloc(strlen(BUF)+1, sizeof(char));        	strcpy(HFORM->name, BUF);		} 		| prompt		{			LINENO++;			HFORM->prompt = (char *) calloc(strlen(BUF)+1, sizeof(char));        	strcpy(HFORM->prompt, BUF);        } 		| labelbody        | fieldbody                formend : _end _form        {        	int rows, cols;        	WINDOW *win;        	LINENO++;        	NO++;        	HFORM->fields[NO] = (FIELD *)0;			HFORM->form = new_form(HFORM->fields);    		scale_form(HFORM->form,&rows,&cols);    		if(rows < HFORM->rows) rows = HFORM->rows;    		if(cols < HFORM->cols) cols = HFORM->cols;    		if(!(win = newwin(rows + 2, cols + 2, HFORM->row, HFORM->col))) {				fprintf(stderr,"%s|%d|建立窗口失败!",__FILE__,__LINE__);				return(-1);			}			if((HFORM->panel = new_panel(win)) == NULL) { //窗口与屏面关联				fprintf(stderr,"%s|%d|建立窗口屏幕失败!",__FILE__,__LINE__);				return(-1);			}			set_form_win(HFORM->form, win);			set_form_sub(HFORM->form, derwin(win, rows, cols, 1, 1));			box(win, 0 , 0);			mvwaddstr(win, 0, (cols + 2 - strlen(HFORM->name)) / 2				, HFORM->name);			keypad(win, 1);			post_form(HFORM->form);			update_panels();//更新屏幕			doupdate();//刷新}        	labelbody : labelsec labelend          fieldbody : fieldsec fieldendlabelsec : _begin _label      {       	LINENO++;      	NO++;      }      | labelsec name      {      	LINENO++;      }      | labelsec position      {      	LINENO++;      }    labelend : _end _label		{      		LINENO++;      	    HFORM->fields[NO] = new_field(1, strlen(BUF), ROW, COL, 0, 0);      		set_field_buffer(HFORM->fields[NO], 0, BUF);            field_opts_off(HFORM->fields[NO], O_ACTIVE);      	}    fieldsec : _begin _field	      {      	NO++;      	LINENO++;      }      | fieldsec position      {      	LINENO++;      }      | fieldsec size      {      	LINENO++;      	HFORM->fields[NO] = new_field(ROWS, COLS, ROW, COL, 0, NBUF);        set_field_back(HFORM->fields[NO], A_UNDERLINE);        field_opts_off(HFORM->fields[NO], O_NULLOK|O_PASSOK|O_AUTOSKIP);      }      | fieldsec default      {      	LINENO++;      	set_field_buffer(HFORM->fields[NO], VALBUF, BUF);      }      | fieldsec index      {      	LINENO++;      	HFORM->index[NO]=INDEX;      }      | fieldsec init      {      	LINENO++;      	HFORM->init[NO] = (char *) calloc(strlen(BUF)+1, sizeof(char));        strcpy(HFORM->init[NO], BUF);      }	  | fieldsec term	  {	  	LINENO++;	  	HFORM->term[NO] = (char *) calloc(strlen(BUF)+1, sizeof(char));        strcpy(HFORM->term[NO], BUF);	  }	  | fieldsec disp	  {	  	LINENO++;	  	HFORM->disp[NO] = (char *) calloc(strlen(BUF)+1, sizeof(char));        strcpy(HFORM->disp[NO], BUF);	  }	  | fieldsec prompt	  {	  	LINENO++;	  	HFORM->fields[NO]->usrptr	  		= (char *) calloc(strlen(BUF)+1, sizeof(char));	  	strcpy(HFORM->fields[NO]->usrptr, BUF);	  }	  | fieldsec type	  {	  	LINENO++;	  }	  | fieldsec fore      {          LINENO++;            set_field_fore(HFORM->fields[NO], $2);      }      | fieldsec back      {          LINENO++;            set_field_back(HFORM->fields[NO], $2);      }	  | fieldsec optson      {        LINENO++;        field_opts_on(HFORM->fields[NO], $2);      }      | fieldsec optsoff      {        LINENO++;        field_opts_off(HFORM->fields[NO], $2);      }      | fieldsec just      {        LINENO++;        set_field_just(HFORM->fields[NO], $2);      }      | fieldsec pagination      {        LINENO++;      }      fieldend : _end _field         {      		LINENO++;         }     name:	_name '=' _text         {            strcpy(BUF, $3);         }         default: _default '=' _text          {            strcpy(BUF, $3);         }         position: _position '='  _digit ',' _digit          {            ROW = $3; COL = $5;         }         size:    _size '=' _digit ',' _digit          {            ROWS = $3; COLS = $5;         }		init:  _init '=' _text       {        	  strcpy(BUF, $3);       }       term:  _term '=' _text	   {          strcpy(BUF, $3);       }disp:  _disp '=' _text	   {          strcpy(BUF, $3);       }       prompt:_prompt '=' _text		{			strcpy(BUF, $3);		}		index: _index '=' _digit      {      	INDEX = $3;      }type:  _type '=' typeex typeex: _type_text	 {	 	set_field_type(HFORM->fields[NO], TYPE_TEXT);	 }	 | _type_ctext	 {		set_field_type(HFORM->fields[NO], TYPE_CTEXT);	 }	 | _type_etext	 {		set_field_type(HFORM->fields[NO], TYPE_ETEXT);	 }	 | _type_date	 {		set_field_type(HFORM->fields[NO], TYPE_DATE);	 }	 | _type_digit	 {		set_field_type(HFORM->fields[NO], TYPE_DIGIT);	 }	 | _type_alpha ',' _digit	 {	 	set_field_type(HFORM->fields[NO], TYPE_ALPHA, $3);	 }	 | _type_integer ',' _digit ',' _digit ',' _digit	 {        set_field_type(HFORM->fields[NO], TYPE_INTEGER, $3, $5, $7);     }     | _type_numeric ',' _digit ',' _float ',' _float     {        set_field_type(HFORM->fields[NO], TYPE_NUMERIC, $3, $5, $7);     }	 | _type_amount ',' _digit ',' _float ',' _float	 {	 	set_field_type(HFORM->fields[NO], TYPE_AMOUNT, $3, $5, $7);	 }	 | _type_list ',' _digit ',' _digit ',' _text	 {	 	set_field_type(HFORM->fields[NO], TYPE_LIST, $3, $5, $7);	 }fore: _fore '=' expr      {        $$=$3;     }      back: _back '=' expr      {        $$=$3;     }      expr:attr     { $$=$1; }     |expr'|'attr     { $$=$1|$3; }     |expr'&'attr     { $$=$1&$3; }     |'~'expr%prec UMINUS//该语法不能使用     { $$=~$2; }        attr:  _a_blink        { $$=A_BLINK; }       |_a_bold         { $$=A_BOLD; }       |_a_dim         { $$=A_DIM; }       |_a_reverse         { $$=A_REVERSE; }       |_a_standout        { $$=A_STANDOUT; }       |_a_underline         { $$=A_UNDERLINE; }       |_a_altcharset        { $$=A_ALTCHARSET; }       |_a_normal       { $$=A_NORMAL; }       optson:_optson '=' optsex        { $$ = $3; }       optsoff: _optsoff '=' optsex         { $$=$3; }        optsex: opt       { $$ = $1; }       |optsex '|' opt       { $$ = $1|$3; }       opt:    _o_visible        { $$=O_VISIBLE; }       |_o_active        { $$=O_ACTIVE; }       |_o_public        { $$=O_PUBLIC; }       |_o_edit        { $$=O_EDIT; }       |_o_wrap        { $$=O_WRAP; }       |_o_blank        { $$=O_BLANK; }       |_o_autoskip        { $$=O_AUTOSKIP; }       |_o_nullok        { $$=O_NULLOK; }       |_o_passok        { $$=O_PASSOK; }       |_o_static         { $$=O_STATIC; }        just:   _just '=' justex        { $$=$3; }      justex: _no_justification       { $$=NO_JUSTIFICATION; }       |_justify_left        { $$=JUSTIFY_LEFT; }       |_justify_right        { $$=JUSTIFY_RIGHT; }       |_justify_center       { $$=JUSTIFY_CENTER; }       pagination: _pagination       {         set_new_page(HFORM->fields[NO], 1);       }       %%yyerror(){   fprintf(stderr, "\r错误:行数[%d]", LINENO+1);}	           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -