📄 parser.y
字号:
/* * File: parser.y * Author: Suman Banerjee <suman@cs.umd.edu> * Date: July 31, 2001 * Terms: GPL * * myns simulator */%{#include <stdio.h>#include "main.h"#include "parser-event.h"#include <agent.h>#include <constants.h>extern RoutingType global_routing_type;extern char global_ts_routing_sgb_filename[];extern int yylineno;extern int yylex(void);int yyparse (void);extern ParserReturnInfo parser_events;%}%union { double dval; int ival; char strval[MAX_NAME_SIZE]; struct AtEvent *ae; AgentType atp; SourceDistributionType sdt;}%token TOK_SEMICOLON TOK_NODE TOK_EDGE TOK_AT%token TOK_START TOK_STOP TOK_PRINT TOK_FINISH TOK_COMMENT TOK_SIMULATOR%token TOK_NODECOUNT TOK_JUNK%token TOK_ATTACH TOK_AGENT%token <ival> TOK_NUMBER_INT%token <dval> TOK_NUMBER_FLOAT%token <strval> TOK_NAME%token <strval> TOK_FILENAME%token TOK_RP TOK_MC%token TOK_COOP TOK_BSE TOK_BEACON TOK_QUERY%token TOK_SET TOK_BURSTSIZE TOK_GAP TOK_SOURCE%token TOK_CONSTANT TOK_UNIFORM TOK_EXPONENTIAL%token TOK_ROUTING TOK_ORACLE TOK_TS%type <ae> at_event%type <atp> agent_type%type <sdt> source_dist%%program : program statement| statement;statement : valid_statement TOK_SEMICOLON;valid_statement : route_statement| nodecount_statement| edge_statement| attach_statement| at_statement| set_statement;route_statement : TOK_ROUTING TOK_ORACLE{ global_routing_type = ROUTE_ORACLE;}| TOK_ROUTING TOK_ORACLE TOK_TS TOK_FILENAME{ global_routing_type = ROUTE_ORACLE_TS; strcpy(global_ts_routing_sgb_filename,$4);};nodecount_statement : TOK_NODECOUNT TOK_NUMBER_INT{ parser_events.num_nodes = $2;};edge_statement : TOK_EDGE TOK_NUMBER_INT TOK_NUMBER_INT TOK_NUMBER_FLOAT{ Edge *e = new Edge ($2,$3,$4); parser_events.edge_list->Add(e,1);};attach_statement : TOK_ATTACH TOK_AGENT TOK_NUMBER_INT TOK_NODE TOK_NUMBER_INT agent_type{ if (parser_events.attach_list->Locate($3) != NULL) { printf ("Err] Agent %d re-attached\n", $3); exit(-1); } Attachment *a = new Attachment($3,$5,$6);; parser_events.attach_list->Add(a,$3);};agent_type : TOK_RP{ $$ = AGENT_APPLICATION_RP;}| TOK_MC{ $$ = AGENT_APPLICATION_MC;}| TOK_BSE{ $$ = AGENT_APPLICATION_BSE;}|TOK_QUERY{ $$ = AGENT_APPLICATION_QUERY;}|TOK_COOP{ $$ = AGENT_APPLICATION_COOP;}|TOK_BEACON{ $$ = AGENT_APPLICATION_BEACON;};at_statement : TOK_AT TOK_NUMBER_FLOAT at_event{ AtEvent * ae = $3; ae->at = $2; parser_events.ev_list->Add(ae,$2);};at_event : TOK_NODE TOK_NUMBER_INT TOK_START{ AtEvent *ae = new AtEvent; ae->t = START_NODE; ae->node = $2; $$ = ae;}| TOK_AGENT TOK_NUMBER_INT TOK_START{ AtEvent *ae = new AtEvent; ae->t = START_AGENT; ae->agent = $2; $$ = ae;}| TOK_NODE TOK_NUMBER_INT TOK_STOP{ AtEvent *ae = new AtEvent; ae->t = STOP_NODE; ae->node = $2; $$ = ae;}| TOK_AGENT TOK_NUMBER_INT TOK_STOP{ AtEvent *ae = new AtEvent; ae->t = STOP_AGENT; ae->agent = $2; $$ = ae;}| TOK_AGENT TOK_NUMBER_INT TOK_SOURCE source_dist TOK_BURSTSIZE TOK_NUMBER_INT TOK_GAP TOK_NUMBER_FLOAT { AtEvent *ae = new AtEvent; ae->t = SOURCE_AGENT; ae->agent = $2; ae->sdt = $4; ae->source_burst = $6; ae->source_gap = $8; $$ = ae;}| TOK_SIMULATOR TOK_STOP{ AtEvent *ae = new AtEvent; ae->t = STOP_SIMULATION; $$ = ae;}| TOK_SIMULATOR TOK_PRINT{ AtEvent *ae = new AtEvent; ae->t = PRINT_SIMULATION_STATUS; $$ = ae;};source_dist: TOK_CONSTANT{ $$ = DIST_CONSTANT;}| TOK_UNIFORM{ $$ = DIST_UNIFORM;}| TOK_EXPONENTIAL{ $$ = DIST_EXPONENTIAL;};set_statement: TOK_SET TOK_NAME TOK_NUMBER_INT{ NamedConstant::setval($2,$3); /* Constant<int>::setval($2,$3); */ /* constant_setval($2,$3,0.0,true); */}| TOK_SET TOK_NAME TOK_NUMBER_FLOAT{ NamedConstant::setval($2,$3); /* Constant<double>::setval($2,$3); */ /* constant_setval($2,0,$3,false); */};%%int yyerror (char *s){ printf ("[Err] in parsing line %d\n", yylineno); exit(-1); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -