%{ #include #include "data.h" int lvl; int gottocode=0; int colno; int lineno; int ignorekw=0; int icnt=1; char *A4GL_strip_quotes(char *s); struct s_parser_start *start; struct s_nodes { int startnode; int endnode; }; %} %start ebnf %verbose %name-prefix="a4gl_ebnf_yy" %union { char str[30000]; struct s_nodes nodes ; //int node; } %token DOT PIPE OPEN_SQUARE CLOSE_SQUARE OPEN_BRACE CLOSE_BRACE STRING OPEN_BRACKET CLOSE_BRACKET NAMED EQUAL ERROR %% ebnf : ebnf_entry | ebnf ebnf_entry ; ebnf_entry : NAMED { printf("digraph {\n"); printf("_r0 [ label=\"%s\" ]\n",$1); printf("_rend [ label=\"|\" ]\n"); } EQUAL rules DOT { printf("_r%d -> _rend [ label=\"\", dir=\"none\" ]\n",$4.endnode /* the end of the node */); printf("}\n"); } ; rule: simple_list { printf("_r%d [label=\"%s\"]\n",icnt, $1); $$.startnode=icnt; $$.endnode=icnt; icnt++; } | OPEN_SQUARE { printf("_r%d [ shape=\"point\",width=0, label=\"openbox\" ]\n",icnt); printf("_r%d [ shape=\"point\", width=0,label=\"closebox\" ]\n",icnt+1); printf("_r%d -> _r%d [ label=\"\", dir=\"none\" ]\n",icnt, icnt+1); $$.startnode=icnt; $$.endnode=icnt+1; push_node(icnt,icnt+1); icnt+=2; } rules CLOSE_SQUARE { printf("_r%d -> _r%d [ label=\"\", dir=\"none\" ] \n",$3.endnode, $2.endnode); pop_node(); $$.startnode=$2.startnode; $$.endnode=$2.endnode; } | OPEN_BRACE { printf("_r%d [ shape=\"point\",width=0, label=\"openbrace\" ]\n",icnt); printf("_r%d [ shape=\"point\", width=0,label=\"closebrace\" ]\n",icnt+1); printf("_r%d -> _r%d [ label=\"\", dir=\"none\" ]\n",icnt+1, icnt); $$.startnode=icnt; $$.endnode=icnt+1; push_node(icnt,icnt+1); icnt+=2; } rules CLOSE_BRACE { printf("_r%d -> _r%d [ label=\"\", dir=\"none\" ] \n",$3.endnode, $2.endnode); pop_node(); $$.startnode=$2.startnode; $$.endnode=$2.endnode; } | OPEN_BRACKET { printf("_r%d [ shape=\"point\", width=0, label=\"\" ]\n",icnt); printf("_r%d [ shape=\"point\", width=0, label=\"\" ]\n",icnt+1); $$.startnode=icnt; $$.endnode=icnt+1; push_node(icnt,icnt+1); icnt+=2; } ruleset CLOSE_BRACKET { pop_node(); $$.startnode=$2.startnode; $$.endnode=$2.endnode; } ; simple_list : simple { strcpy($$,$1); } | simple_list simple { sprintf($$,"%s %s",$1,$2); } ; simple : STRING {strcpy($$,$1);} | NAMED {strcpy($$,$1);} ; rules : rule { printf("_r%d -> _r%d [label=\"\", dir=\"none\"] \n", last_node_start(),$1.startnode); $$.startnode=$1.startnode; $$.endnode=$1.endnode; } | rules rule { printf("_r%d -> _r%d [label=\"\", dir=\"none\"]\n", $1.endnode,$2.startnode); $$.startnode=$2.startnode; $$.endnode=$2.endnode; } ; ruleset: rules { printf("_r%d -> _r%d [label=\"\", dir=\"none\"] \n", $1.endnode, last_node_end()); } | ruleset PIPE rules { printf("_r%d -> _r%d [label=\"\", dir=\"none\"] \n", $3.endnode, last_node_end()); } ; %% #include "lex.yyx.c"