📄 parser.y
字号:
%{#include <malloc.h>#include <string.h>#include "v86bios.h"#include "pci.h" #define YYSTYPE unsigned long #define MAX_VAR 0x20 CARD32 var[MAX_VAR]; CARD32 var_mem;i86biosRegs regs = { 00 };enum mem_type { BYTE, WORD, LONG, STRING };union mem_val { CARD32 integer; char *ptr;} rec;struct mem { enum mem_type type; union mem_val val; struct mem *next;}; struct device Device = {FALSE,NONE,{0}};extern void yyerror(char *s);extern int yylex( void ); static void boot(void);static void dump_mem(CARD32 addr, int len);static void exec_int(int num);static void *add_to_list(enum mem_type type, union mem_val *rec, void *next);static void do_list(struct mem *list, memType addr);static char * normalize_string(char *ptr);%}%token TOK_NUM%token TOK_REG_AX%token TOK_REG_BX%token TOK_REG_CX%token TOK_REG_DX%token TOK_REG_DI%token TOK_REG_SI%token TOK_SEG_DS%token TOK_SEG_ES%token TOK_SEP%token TOK_VAR%token TOK_VAR_MEM%token TOK_COMMAND_BOOT%token TOK_COMMAND_EXEC%token TOK_SELECT%token TOK_STRING%token TOK_MODIFIER_BYTE%token TOK_MODIFIER_WORD%token TOK_MODIFIER_LONG%token TOK_MODIFIER_MEMSET%token TOK_COMMAND_MEMSET%token TOK_COMMAND_MEMDUMP%token TOK_COMMAND_QUIT%token TOK_ERROR%token TOK_END%token TOK_ISA%token TOK_PCI%token TOK_BYTE%token TOK_WORD%token TOK_LONG%token TOK_PRINT_PORT%token TOK_IOSTAT%token TOK_PRINT_IRQ%token TOK_PPCI%token TOK_PIP%token TOK_TRACE%token TOK_ON%token TOK_OFF%token TOK_VERBOSE%token TOK_LOG%token TOK_LOGOFF%token TOK_CLSTAT%token TOK_STDOUT%token TOK_HLT%token TOK_DEL%token TOK_IOPERM%token TOK_DUMP_PCI%token TOK_BOOT_BIOS%%input: | input line line: end | com_reg | com_var | com_select | com_boot | com_memset | com_memdump | com_quit | com_exec | hlp | config | verbose | logging | print | clstat | com_hlt | ioperm | list_pci | boot_bios | error end { printf("unknown command\n"); };end: TOK_END;com_reg: reg_off val end { *(CARD16*)$1 = $2 & 0xffff; } | reg_seg TOK_SEP reg_off val end { *(CARD16*)$1 = ($4 & 0xf0000) >> 4; *(CARD16*)$3 = ($4 & 0x0ffff); } | reg_off '?' end { printf("0x%x\n",*(CARD16*)$1);} | reg_seg TOK_SEP reg_off '?' end { printf("0x%x:0x%x\n",*(CARD16*)$1, *(CARD16*)$3); };register_read: reg_seg TOK_SEP reg_off { $$ = (((*(CARD16*)$1) << 4) | ((*(CARD16*)$3) & 0xffff)); } | reg_off { $$ = ((*(CARD16*)$1) & 0xffff); };reg_off: TOK_REG_AX { $$ = (unsigned long)&(regs.ax); } | TOK_REG_BX { $$ = (unsigned long)&(regs.bx); } | TOK_REG_CX { $$ = (unsigned long)&(regs.cx); } | TOK_REG_DX { $$ = (unsigned long)&(regs.dx); } | TOK_REG_DI { $$ = (unsigned long)&(regs.di); } | TOK_REG_SI { $$ = (unsigned long)&(regs.si); };reg_seg: TOK_SEG_DS { $$ = (unsigned long)&(regs.ds); } | TOK_SEG_ES { $$ = (unsigned long)&(regs.es); };com_var: TOK_VAR_MEM '?' end { printf("var mem: 0x%x\n",var_mem); } | TOK_VAR '?' end { if ($1 < MAX_VAR) printf("var[%i]: 0x%x\n",(int)$1,var[$1]); else printf("var index %i out of range\n",(int)$1); } | TOK_VAR_MEM val end { var_mem = $2; } | TOK_VAR val end { if ($1 <= MAX_VAR) var[$1] = $2; else printf("var index %i out of range\n",(int)$1); } | TOK_VAR error end { printf("$i val\n"); } | TOK_VAR_MEM error end { printf("$i val\n"); };com_boot: TOK_COMMAND_BOOT end { boot(); } TOK_COMMAND_BOOT error end { boot(); };com_select: TOK_SELECT TOK_ISA end { Device.booted = FALSE; Device.type = ISA; CurrentPci = NULL; } | TOK_SELECT TOK_PCI val TOK_SEP val TOK_SEP val end { Device.booted = FALSE; Device.type = PCI; Device.loc.pci.bus = $3; Device.loc.pci.dev = $5; Device.loc.pci.func = $7; } | TOK_SELECT '?' end { switch (Device.type) { case ISA: printf("isa\n"); break; case PCI: printf("pci: %x:%x:%x\n",Device.loc.pci.bus, Device.loc.pci.dev, Device.loc.pci.func); break; default: printf("no device selected\n"); break; } } | TOK_SELECT error end { printf("select ? | isa " "| pci:bus:dev:func\n"); };com_quit: TOK_COMMAND_QUIT end { return 0; } | TOK_COMMAND_QUIT error end { logoff(); return 0; };com_exec: TOK_COMMAND_EXEC end { exec_int(0x10); } | TOK_COMMAND_EXEC val end { exec_int($2); } | TOK_COMMAND_EXEC error end { exec_int(0x10); };com_memdump: TOK_COMMAND_MEMDUMP val val end { dump_mem($2,$3); } | TOK_COMMAND_MEMDUMP error end { printf("memdump start len\n"); } ;com_memset: TOK_COMMAND_MEMSET val list end { do_list((struct mem*)$3,$2);} | TOK_COMMAND_MEMSET error end { printf("setmem addr [byte val] " "[word val] [long val] " "[\"string\"]\n"); };list: { $$ = 0; } | TOK_BYTE val list { rec.integer = $2; $$ = (unsigned long)add_to_list(BYTE,&rec,(void*)$3); } | TOK_WORD val list { rec.integer = $2; $$ = (unsigned long) add_to_list(WORD,&rec,(void*)$3); } | TOK_LONG val list { rec.integer = $2; $$ = (unsigned long) add_to_list(LONG,&rec,(void*)$3); } | TOK_STRING list { rec.ptr = (void*)$1; $$ = (unsigned long) add_to_list(STRING,&rec,(void*)$2); };val: TOK_VAR { if ($1 > MAX_VAR) { printf("variable index out of range\n"); $$=0; } else $$ = var[$1]; } | TOK_NUM { $$ = $1; } | register_read; bool: TOK_ON { $$ = 1; } | TOK_OFF { $$ = 0; };config: TOK_PRINT_PORT bool end { Config.PrintPort = $2; } | TOK_PRINT_PORT '?' end { printf("print port %s\n", Config.PrintPort?"on":"off"); } | TOK_PRINT_PORT error end { printf("pport on | off | ?\n") } | TOK_PRINT_IRQ bool end { Config.PrintIrq = $2; } | TOK_PRINT_IRQ '?' end { printf("print irq %s\n", Config.PrintIrq?"on":"off"); } | TOK_PRINT_IRQ error end { printf("pirq on | off | ?\n") } | TOK_PPCI bool end { Config.PrintPci = $2; } | TOK_PPCI '?' end { printf("print PCI %s\n", Config.PrintPci?"on":"off"); } | TOK_PPCI error end { printf("ppci on | off | ?\n") } | TOK_PIP bool end { Config.PrintIp = $2; } | TOK_PIP '?' end { printf("printip %s\n", Config.PrintIp?"on":"off"); } | TOK_PIP error end { printf("pip on | off | ?\n") } | TOK_IOSTAT bool end { Config.IoStatistics = $2; } | TOK_IOSTAT '?' end { printf("io statistics %s\n", Config.IoStatistics?"on":"off"); } | TOK_IOSTAT error end { printf("iostat on | off | ?\n") } | TOK_TRACE bool end { Config.Trace = $2; } | TOK_TRACE '?' end { printf("trace %s\n", Config.Trace ?"on":"off"); } | TOK_TRACE error end { printf("trace on | off | ?\n") } ;verbose: TOK_VERBOSE val end { Config.Verbose = $2; } | TOK_VERBOSE '?' end { printf("verbose: %i\n", Config.Verbose); } | TOK_VERBOSE error end { printf("verbose val | ?\n"); };logging: TOK_LOG TOK_STRING end { logon(normalize_string((char*)$2)); } | TOK_LOG '?' end { if (logging) printf("logfile: %s\n", logfile); else printf("no logging\n?"); } | TOK_LOG TOK_OFF end { logoff(); } | TOK_LOG error end { printf("log \"<filename>\" | ? |" " off\n"); };clstat: TOK_CLSTAT end { clear_stat(); } | TOK_CLSTAT error end { printf("clstat\n"); } ;print: TOK_STDOUT bool end { nostdout = !$2; } | TOK_STDOUT '?' end { printf("print %s\n",nostdout ? "no":"yes"); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -