📄 myform.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 + -