grammar.y
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:7k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. %{
  2. /*
  3.  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996
  4.  * The Regents of the University of California.  All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that: (1) source code distributions
  8.  * retain the above copyright notice and this paragraph in its entirety, (2)
  9.  * distributions including binary code include the above copyright notice and
  10.  * this paragraph in its entirety in the documentation or other materials
  11.  * provided with the distribution, and (3) all advertising materials mentioning
  12.  * features or use of this software display the following acknowledgement:
  13.  * ``This product includes software developed by the University of California,
  14.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  15.  * the University nor the names of its contributors may be used to endorse
  16.  * or promote products derived from this software without specific prior
  17.  * written permission.
  18.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  19.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  20.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  21.  *
  22.  */
  23. #ifndef lint
  24. static const char rcsid[] =
  25.     "@(#) $Header: /usr/local/cvs/nessus-libraries/libpcap-nessus/grammar.y,v 1.3 2003/02/06 20:28:08 renaud Exp $ (LBL)";
  26. #endif
  27. #include <sys/types.h>
  28. #include <sys/time.h>
  29. #include <sys/socket.h>
  30. #if __STDC__
  31. struct mbuf;
  32. struct rtentry;
  33. #endif
  34. #include <net/if.h>
  35. #include <netinet/in.h>
  36. #include <netinet/if_ether.h>
  37. #include <stdio.h>
  38. #include "pcap-int.h"
  39. #include "gencode.h"
  40. #include "pcap-namedb.h"
  41. #include "gnuc.h"
  42. #ifdef HAVE_OS_PROTO_H
  43. #include "os-proto.h"
  44. #endif
  45. #define QSET(q, p, d, a) (q).proto = (p),
  46.  (q).dir = (d),
  47.  (q).addr = (a)
  48. int n_errors = 0;
  49. static struct qual qerr = { Q_UNDEF, Q_UNDEF, Q_UNDEF, Q_UNDEF };
  50. static void
  51. yyerror(char *msg)
  52. {
  53. ++n_errors;
  54. bpf_error("%s", msg);
  55. /* NOTREACHED */
  56. }
  57. #ifndef YYBISON
  58. int yyparse(void);
  59. int
  60. pcap_parse()
  61. {
  62. return (yyparse());
  63. }
  64. #endif
  65. %}
  66. %union {
  67. int i;
  68. bpf_u_int32 h;
  69. u_char *e;
  70. char *s;
  71. struct stmt *stmt;
  72. struct arth *a;
  73. struct {
  74. struct qual q;
  75. struct block *b;
  76. } blk;
  77. struct block *rblk;
  78. }
  79. %type <blk> expr id nid pid term rterm qid
  80. %type <blk> head
  81. %type <i> pqual dqual aqual ndaqual
  82. %type <a> arth narth
  83. %type <i> byteop pname pnum relop irelop
  84. %type <blk> and or paren not null prog
  85. %type <rblk> other
  86. %token  DST SRC HOST GATEWAY
  87. %token  NET MASK PORT LESS GREATER PROTO BYTE
  88. %token  ARP RARP IP TCP UDP ICMP IGMP IGRP
  89. %token  ATALK DECNET LAT SCA MOPRC MOPDL
  90. %token  TK_BROADCAST TK_MULTICAST
  91. %token  NUM INBOUND OUTBOUND
  92. %token  LINK
  93. %token GEQ LEQ NEQ
  94. %token ID EID HID
  95. %token LSH RSH
  96. %token  LEN
  97. %type <s> ID
  98. %type <e> EID
  99. %type <s> HID
  100. %type <i> NUM
  101. %left OR AND
  102. %nonassoc  '!'
  103. %left '|'
  104. %left '&'
  105. %left LSH RSH
  106. %left '+' '-'
  107. %left '*' '/'
  108. %nonassoc UMINUS
  109. %%
  110. prog:   null expr
  111. {
  112. finish_parse($2.b);
  113. }
  114. | null
  115. ;
  116. null:   /* null */ { $$.q = qerr; }
  117. ;
  118. expr:   term
  119. | expr and term { gen_and($1.b, $3.b); $$ = $3; }
  120. | expr and id { gen_and($1.b, $3.b); $$ = $3; }
  121. | expr or term { gen_or($1.b, $3.b); $$ = $3; }
  122. | expr or id { gen_or($1.b, $3.b); $$ = $3; }
  123. ;
  124. and:   AND { $$ = $<blk>0; }
  125. ;
  126. or:   OR { $$ = $<blk>0; }
  127. ;
  128. id:   nid
  129. | pnum { $$.b = gen_ncode(NULL, (bpf_u_int32)$1,
  130.    $$.q = $<blk>0.q); }
  131. | paren pid ')' { $$ = $2; }
  132. ;
  133. nid:   ID { $$.b = gen_scode($1, $$.q = $<blk>0.q); }
  134. | HID '/' NUM { $$.b = gen_mcode($1, NULL, $3,
  135.     $$.q = $<blk>0.q); }
  136. | HID MASK HID { $$.b = gen_mcode($1, $3, 0,
  137.     $$.q = $<blk>0.q); }
  138. | HID {
  139.   /* Decide how to parse HID based on proto */
  140.   $$.q = $<blk>0.q;
  141.   switch ($$.q.proto) {
  142.   case Q_DECNET:
  143. $$.b = gen_ncode($1, 0, $$.q);
  144. break;
  145.   default:
  146. $$.b = gen_ncode($1, 0, $$.q);
  147. break;
  148.   }
  149. }
  150. | EID { $$.b = gen_ecode($1, $$.q = $<blk>0.q); }
  151. | not id { gen_not($2.b); $$ = $2; }
  152. ;
  153. not:   '!' { $$ = $<blk>0; }
  154. ;
  155. paren:   '(' { $$ = $<blk>0; }
  156. ;
  157. pid:   nid
  158. | qid and id { gen_and($1.b, $3.b); $$ = $3; }
  159. | qid or id { gen_or($1.b, $3.b); $$ = $3; }
  160. ;
  161. qid:   pnum { $$.b = gen_ncode(NULL, (bpf_u_int32)$1,
  162.    $$.q = $<blk>0.q); }
  163. | pid
  164. ;
  165. term:   rterm
  166. | not term { gen_not($2.b); $$ = $2; }
  167. ;
  168. head:   pqual dqual aqual { QSET($$.q, $1, $2, $3); }
  169. | pqual dqual { QSET($$.q, $1, $2, Q_DEFAULT); }
  170. | pqual aqual { QSET($$.q, $1, Q_DEFAULT, $2); }
  171. | pqual PROTO { QSET($$.q, $1, Q_DEFAULT, Q_PROTO); }
  172. | pqual ndaqual { QSET($$.q, $1, Q_DEFAULT, $2); }
  173. ;
  174. rterm:   head id { $$ = $2; }
  175. | paren expr ')' { $$.b = $2.b; $$.q = $1.q; }
  176. | pname { $$.b = gen_proto_abbrev($1); $$.q = qerr; }
  177. | arth relop arth { $$.b = gen_relation($2, $1, $3, 0);
  178.   $$.q = qerr; }
  179. | arth irelop arth { $$.b = gen_relation($2, $1, $3, 1);
  180.   $$.q = qerr; }
  181. | other { $$.b = $1; $$.q = qerr; }
  182. ;
  183. /* protocol level qualifiers */
  184. pqual:   pname
  185. | { $$ = Q_DEFAULT; }
  186. ;
  187. /* 'direction' qualifiers */
  188. dqual:   SRC { $$ = Q_SRC; }
  189. | DST { $$ = Q_DST; }
  190. | SRC OR DST { $$ = Q_OR; }
  191. | DST OR SRC { $$ = Q_OR; }
  192. | SRC AND DST { $$ = Q_AND; }
  193. | DST AND SRC { $$ = Q_AND; }
  194. ;
  195. /* address type qualifiers */
  196. aqual:   HOST { $$ = Q_HOST; }
  197. | NET { $$ = Q_NET; }
  198. | PORT { $$ = Q_PORT; }
  199. ;
  200. /* non-directional address type qualifiers */
  201. ndaqual:  GATEWAY { $$ = Q_GATEWAY; }
  202. ;
  203. pname:   LINK { $$ = Q_LINK; }
  204. | IP { $$ = Q_IP; }
  205. | ARP { $$ = Q_ARP; }
  206. | RARP { $$ = Q_RARP; }
  207. | TCP { $$ = Q_TCP; }
  208. | UDP { $$ = Q_UDP; }
  209. | ICMP { $$ = Q_ICMP; }
  210. | IGMP { $$ = Q_IGMP; }
  211. | IGRP { $$ = Q_IGRP; }
  212. | ATALK { $$ = Q_ATALK; }
  213. | DECNET { $$ = Q_DECNET; }
  214. | LAT { $$ = Q_LAT; }
  215. | SCA { $$ = Q_SCA; }
  216. | MOPDL { $$ = Q_MOPDL; }
  217. | MOPRC { $$ = Q_MOPRC; }
  218. ;
  219. other:   pqual TK_BROADCAST { $$ = gen_broadcast($1); }
  220. | pqual TK_MULTICAST { $$ = gen_multicast($1); }
  221. | LESS NUM { $$ = gen_less($2); }
  222. | GREATER NUM { $$ = gen_greater($2); }
  223. | BYTE NUM byteop NUM { $$ = gen_byteop($3, $2, $4); }
  224. | INBOUND { $$ = gen_inbound(0); }
  225. | OUTBOUND { $$ = gen_inbound(1); }
  226. ;
  227. relop:   '>' { $$ = BPF_JGT; }
  228. | GEQ { $$ = BPF_JGE; }
  229. | '=' { $$ = BPF_JEQ; }
  230. ;
  231. irelop:   LEQ { $$ = BPF_JGT; }
  232. | '<' { $$ = BPF_JGE; }
  233. | NEQ { $$ = BPF_JEQ; }
  234. ;
  235. arth:   pnum { $$ = gen_loadi($1); }
  236. | narth
  237. ;
  238. narth:   pname '[' arth ']' { $$ = gen_load($1, $3, 1); }
  239. | pname '[' arth ':' NUM ']' { $$ = gen_load($1, $3, $5); }
  240. | arth '+' arth { $$ = gen_arth(BPF_ADD, $1, $3); }
  241. | arth '-' arth { $$ = gen_arth(BPF_SUB, $1, $3); }
  242. | arth '*' arth { $$ = gen_arth(BPF_MUL, $1, $3); }
  243. | arth '/' arth { $$ = gen_arth(BPF_DIV, $1, $3); }
  244. | arth '&' arth { $$ = gen_arth(BPF_AND, $1, $3); }
  245. | arth '|' arth { $$ = gen_arth(BPF_OR, $1, $3); }
  246. | arth LSH arth { $$ = gen_arth(BPF_LSH, $1, $3); }
  247. | arth RSH arth { $$ = gen_arth(BPF_RSH, $1, $3); }
  248. | '-' arth %prec UMINUS { $$ = gen_neg($2); }
  249. | paren narth ')' { $$ = $2; }
  250. | LEN { $$ = gen_loadlen(); }
  251. ;
  252. byteop:   '&' { $$ = '&'; }
  253. | '|' { $$ = '|'; }
  254. | '<' { $$ = '<'; }
  255. | '>' { $$ = '>'; }
  256. | '=' { $$ = '='; }
  257. ;
  258. pnum:   NUM
  259. | paren pnum ')' { $$ = $2; }
  260. ;
  261. %%