Advertisement
Guest User

Lexer

a guest
Feb 21st, 2011
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.49 KB | None | 0 0
  1. grammar hhl;
  2.  
  3. options {
  4. language = Java;
  5. output = AST;
  6. ASTLabelType = CommonTree;
  7. }
  8.  
  9. tokens {
  10. PRINT; PRINT_STRING; SLEEP; DO_CLICK; SELECT_CONTEXT_MENU; MAP_MOVE; MAP_MOVE_STEP; IS_CURSOR; SEND_ACTION; SEND_ACTION2; MAP_CLICK; MAP_INTERACT_CLICK;
  11. MAP_INTERACT_CLICK2; DROP; INPUT_GET_OBJECT; HAVE_INVENTORY; SET_INVENTORY; RESET_INVENTORY; NEXT_ITEM; GET_ITEMS_COUNT; MAP_ABS_INTERACT_CLICK;
  12. SET_ITEM_INDEX; IS_ITEM_NAME; ITEM_QUALITY; ITEM_CLICK; ITEM_CLICK2; ITEM_COORD_X; ITEM_COORD_Y; ITEM_NUM; ITEM_METER; ITEM_DROP; WAIT_CRAFT; CHECK_CRAFT;
  13. FIND_OBJECT_BY_NAME; CRAFT; ITEM_DROP_TO_INVENTORY; FIND_OBJECT_BY_TYPE; EQUIP; INVENTORY; INVENTORY2; MAP_ABS_CLICK; MY_COORD_X; MY_COORD_Y;
  14. IS_ITEM_TOOLTIP; EXIT; LOGOUT; SAY; FIND_MAP_OBJECT; OPEN_INVENTORY; SET_SHOW_VAR; SET_ITEM_DRAG; SET_ITEM_EQUIP;
  15. RENDER_MODE; GET_OBJECT_BLOB; RESET_BUFF; NEXT_BUFF; BUFF_METER; BUFF_TIME_METER; IS_BUFF_NAME; MAP_PLACE; BUILD_CLICK;
  16.  
  17. NOT; NEGATE;
  18. PROGRAM; INCLUDE; INCLUDELIST; VARIABLES; FUNCTIONS; CALL;
  19. IF; IFELSE; WHILE; FOR; RETURN; BREAK; CONTINUE; STMTS; EXPR; EXPRLIST; VAR; INDEX; NUM; BLOCK; EMPTY; NOP;
  20. VARDECL; ARRAYDECL; ASSIGN; POSTFIX; PREFIX;
  21. FUNCTION; VARPARAM; ARRAYPARAM; PARAMATERS;
  22. }
  23.  
  24. @header {
  25. package haven.hhl;
  26. }
  27.  
  28. @lexer::header {
  29. package haven.hhl;
  30. }
  31.  
  32. //----------------------------------------------------------------------
  33. // SYNTAX
  34.  
  35. start
  36. : includeList program -> {stream_includeList.size() > 0 }? ^(INCLUDELIST includeList) program
  37. -> ^(INCLUDELIST EMPTY) program
  38. ;
  39.  
  40. program
  41. : varList functionList -> {stream_varList.size()>0 }? ^(PROGRAM ^(VARIABLES varList) ^(FUNCTIONS functionList) ^(CALL {adaptor.create(IDENT,"main")} ^(EXPRLIST)))
  42. -> ^(PROGRAM ^(VARIABLES EMPTY) ^(FUNCTIONS functionList) ^(CALL {adaptor.create(IDENT,"main")} ^(EXPRLIST)))
  43. ;
  44.  
  45. includeList
  46. : include*
  47. ;
  48.  
  49. include
  50. : ('#include' '<' IDENT '>') -> ^(INCLUDE IDENT)
  51. ;
  52.  
  53. functionList
  54. : functionDeclaration+
  55. ;
  56.  
  57. functionDeclaration
  58. : TYPE IDENT paramList act=block -> ^(FUNCTION TYPE IDENT ^(PARAMATERS paramList) $act)
  59. ;
  60.  
  61. paramList
  62. : '(' ')' -> EMPTY
  63. | '(' paramDecl (',' paramDecl)* ')' -> paramDecl+
  64. ;
  65.  
  66. paramDecl
  67. : TYPE IDENT -> ^(VARPARAM TYPE IDENT)
  68. | TYPE '[' ']' IDENT -> ^(ARRAYPARAM TYPE IDENT)
  69. ;
  70.  
  71. block
  72. : '{' '}' -> ^(BLOCK EMPTY)
  73. | '{' statement+ '}' -> ^(BLOCK statement+)
  74. ;
  75.  
  76. statement
  77. options { backtrack = true; }
  78. : ';' -> NOP
  79. | varDeclaration
  80. | expression ';' -> expression
  81. | IDENT '=' expression ';' -> ^(ASSIGN IDENT expression)
  82. | if_statement
  83. | while_statement
  84. | for_statement
  85. | 'return' expression ';' -> ^(RETURN expression)
  86. | 'break' ';' -> BREAK
  87. | 'continue' ';' -> CONTINUE
  88. | 'sleep' '(' expression ')' ';' -> ^(SLEEP expression)
  89. | 'print' '(' expression ')' ';' -> ^(PRINT expression)
  90. | 'print' '(' s=STRING ')' ';' -> ^(PRINT_STRING $s)
  91. | 'exit' ';' -> ^(EXIT)
  92. | 'logout' ';' -> ^(LOGOUT)
  93. | 'say' '(' s=STRING ')' ';' -> ^(SAY $s)
  94. | 'do_click' '(' obj=expression ',' btn=expression ',' mod=expression ')' ';'
  95. -> ^(DO_CLICK $obj $btn $mod)
  96. | 'select_context_menu' '(' sname=STRING ')' ';'
  97. -> ^(SELECT_CONTEXT_MENU $sname)
  98. | 'map_move' '(' id=expression ',' x=expression ',' y=expression ')' ';'
  99. -> ^(MAP_MOVE $id $x $y)
  100. | 'map_move_step' '(' x=expression ',' y=expression ')' ';'
  101. -> ^(MAP_MOVE_STEP $x $y)
  102. | 'send_action' '(' sname=STRING ')' ';'
  103. -> ^(SEND_ACTION $sname)
  104. | 'send_action' '(' sname=STRING ',' sname2=STRING ')' ';'
  105. -> ^(SEND_ACTION2 $sname $sname2)
  106. | 'map_click' '(' x=expression ',' y=expression ',' btn=expression ',' mod=expression ')' ';'
  107. -> ^(MAP_CLICK $x $y $btn $mod)
  108. | 'map_interact_click' '(' x=expression ',' y=expression ',' mod=expression ')' ';'
  109. -> ^(MAP_INTERACT_CLICK $x $y $mod)
  110. | 'map_abs_interact_click' '(' x=expression ',' y=expression ',' mod=expression ')' ';'
  111. -> ^(MAP_ABS_INTERACT_CLICK $x $y $mod)
  112. | 'map_interact_click' '(' id=expression ',' mod=expression ')' ';'
  113. -> ^(MAP_INTERACT_CLICK2 $id $mod)
  114. | 'drop' '(' mod=expression ')' ';'
  115. -> ^(DROP $mod)
  116. | 'reset_inventory' '(' ')' ';'
  117. -> ^(RESET_INVENTORY)
  118. | 'set_item_index' '(' index=expression ')' ';'
  119. -> ^(SET_ITEM_INDEX $index)
  120. | 'set_item_drag' '(' ')' ';'
  121. -> ^(SET_ITEM_DRAG)
  122. | 'item_click' '(' action=STRING ')' ';'
  123. -> ^(ITEM_CLICK $action)
  124. | 'item_click' '(' action=STRING ',' mod=expression ')' ';'
  125. -> ^(ITEM_CLICK2 $action $mod)
  126. | 'item_drop' '(' x=expression ',' y=expression ')' ';'
  127. -> ^(ITEM_DROP $x $y)
  128. | 'item_drop_to_inventory' '(' n=STRING ',' x=expression ',' y=expression ')' ';'
  129. -> ^(ITEM_DROP_TO_INVENTORY $n $x $y)
  130. | 'craft' '(' a=expression ')' ';'
  131. -> ^(CRAFT $a)
  132. | 'equip' '(' slot=expression ',' act=STRING ')' ';'
  133. -> ^(EQUIP $slot $act)
  134. | 'inventory' '(' n=STRING ',' x=expression ',' y=expression ',' act=STRING ')' ';'
  135. -> ^(INVENTORY $n $x $y $act)
  136. | 'inventory' '(' n=STRING ',' x=expression ',' y=expression ',' act=STRING ',' mod=expression ')' ';'
  137. -> ^(INVENTORY $n $x $y $act $mod)
  138. | 'map_abs_click' '(' x=expression ',' y=expression ',' btn=expression ',' mod=expression ')' ';'
  139. -> ^(MAP_ABS_CLICK $x $y $btn $mod)
  140. | 'wait_craft' '(' wnd=STRING ')' ';'
  141. -> ^(WAIT_CRAFT $wnd)
  142. | 'open_inventory' '(' ')' -> ^(OPEN_INVENTORY)
  143. | 'set_show_var' '(' s=STRING ')' ';' -> ^(SET_SHOW_VAR $s)
  144. | 'render_mode' '(' x=expression ')' ';'
  145. -> ^(RENDER_MODE $x)
  146. | 'reset_buff' '(' ')' ';' -> ^(RESET_BUFF)
  147. | 'map_place' '(' x=expression ',' y=expression ',' btn=expression ',' mod=expression ')' ';'
  148. -> ^(MAP_PLACE $x $y $btn $mod)
  149. | 'build_click' '(' ')' ';' -> ^(BUILD_CLICK)
  150. | 'set_item_equip' '(' i=expression ')' ';'
  151. -> ^(SET_ITEM_EQUIP $i)
  152.  
  153. | block
  154. ;
  155.  
  156. for_statement
  157. : 'for' '(' ini=expression ';' tes=expression ';' inc=expression ')' statement
  158. -> $ini ^(WHILE $tes ^(BLOCK statement $inc))
  159. | 'for' '(' t=TYPE name=IDENT '=' ini=expression ';' tes=expression ';' inc=expression ')' statement
  160. -> ^(VARDECL $t $name) ^(ASSIGN $name $ini) ^(WHILE $tes ^(BLOCK statement $inc))
  161. ;
  162.  
  163. if_statement
  164. options { backtrack = true; }
  165. : 'if' '(' expression ')' a1=statement 'else' a2=statement -> ^(IF ^(EXPR expression) $a1 $a2)
  166. | 'if' '(' expression ')' a1=statement -> ^(IF ^(EXPR expression) $a1 NOP)
  167. ;
  168.  
  169. while_statement
  170. : 'while' '(' expression ')' statement -> ^(WHILE expression statement)
  171. | 'do' st=statement 'while' '(' e=expression ')' ';' -> $st ^(WHILE $e $st)
  172. ;
  173.  
  174. varList
  175. : varDeclaration*
  176. ;
  177.  
  178. varDeclaration
  179. : TYPE IDENT ';' -> ^(VARDECL TYPE IDENT)
  180. | TYPE IDENT '=' expression ';' -> ^(VARDECL TYPE IDENT) ^(ASSIGN IDENT expression)
  181. | TYPE IDENT '[' INT ']' ';' -> ^(ARRAYDECL TYPE IDENT INT)
  182. ;
  183.  
  184. expressionList
  185. : '(' ')' -> ^(EXPRLIST)
  186. | '(' expression (',' expression)* ')' -> ^(EXPRLIST expression+)
  187. ;
  188.  
  189. expression
  190. options {backtrack=true;}
  191. : IDENT '=' expression -> ^(ASSIGN IDENT expression)
  192. | arrayIndex '=' expression -> ^(ASSIGN arrayIndex expression)
  193. | orExpression
  194. ;
  195.  
  196. orExpression
  197. : andExpression ( ('or' | '||')^ andExpression)*
  198. ;
  199.  
  200. andExpression
  201. : equalExpression ( ('and' | '&&')^ equalExpression)*
  202. ;
  203.  
  204. equalExpression
  205. : comparsionExpression ( ('==' | '!=' | '<>')^ comparsionExpression)*
  206. ;
  207.  
  208. comparsionExpression
  209. : addExpression ( ('>' | '<' | '>=' | '<=')^ addExpression)*
  210. ;
  211.  
  212. addExpression
  213. : multExpression ( ('+' | '-')^ multExpression)*
  214. ;
  215.  
  216. multExpression
  217. : notExpression ( ('*' | '/' | '%')^ notExpression)*
  218. ;
  219.  
  220. notExpression
  221. : (op='!'|'not')? negationExpression -> {$op != null}? ^(NOT negationExpression)
  222. -> negationExpression
  223. ;
  224.  
  225. negationExpression
  226. : (op='-')? primary -> {$op != null}? ^(NEGATE primary)
  227. -> primary
  228. ;
  229.  
  230. primary
  231. : atom
  232. | '(' expression ')' -> expression
  233. ;
  234.  
  235. atom
  236. : IDENT '++' -> ^(POSTFIX ^(VAR IDENT) ^(NUM {adaptor.create(INT,"1")}) )
  237. | IDENT '--' -> ^(POSTFIX ^(VAR IDENT) ^(NUM {adaptor.create(INT,"-1")}))
  238. | '++' IDENT -> ^(PREFIX ^(VAR IDENT) ^(NUM {adaptor.create(INT,"1")}))
  239. | '--' IDENT -> ^(PREFIX ^(VAR IDENT) ^(NUM {adaptor.create(INT,"-1")}))
  240. | IDENT -> ^(VAR IDENT)
  241. | INT -> ^(NUM INT)
  242. | IDENT expressionList -> ^(CALL IDENT expressionList)
  243. | 'is_cursor' '(' cur=STRING ')' -> ^(IS_CURSOR $cur)
  244. | arrayIndex
  245. | 'input_get_object' '(' msg=STRING ')' -> ^(INPUT_GET_OBJECT $msg)
  246. | 'have_inventory' '(' name=STRING ')' -> ^(HAVE_INVENTORY $name)
  247. | 'set_inventory' '(' name=STRING ')'
  248. -> ^(SET_INVENTORY $name)
  249. | 'next_item' '(' ')' -> ^(NEXT_ITEM)
  250. | 'get_items_count' '(' ')' -> ^(GET_ITEMS_COUNT)
  251. | 'is_item_name' '(' name=STRING ')' -> ^(IS_ITEM_NAME $name)
  252. | 'is_item_tooltip' '(' name=STRING ')' -> ^(IS_ITEM_TOOLTIP $name)
  253. | 'item_quality' '(' ')' -> ^(ITEM_QUALITY)
  254. | 'item_coord_x' '(' ')' -> ^(ITEM_COORD_X)
  255. | 'item_coord_y' '(' ')' -> ^(ITEM_COORD_Y)
  256. | 'item_num' '(' ')' -> ^(ITEM_NUM)
  257. | 'item_meter' '(' ')' -> ^(ITEM_METER)
  258. | 'find_object_by_name' '(' n=STRING ',' r=expression ')' -> ^(FIND_OBJECT_BY_NAME $n $r)
  259. | 'find_object_by_type' '(' n=STRING ',' r=expression ')' -> ^(FIND_OBJECT_BY_TYPE $n $r)
  260. | 'find_map_object' '(' n=STRING ',' r=expression ',' x=expression ',' y=expression ')' -> ^(FIND_MAP_OBJECT $n $r $x $y)
  261. | 'my_coord_x' '(' ')' -> ^(MY_COORD_X)
  262. | 'my_coord_y' '(' ')' -> ^(MY_COORD_Y)
  263. | 'check_craft' '(' wnd=STRING ')' -> ^(CHECK_CRAFT $wnd)
  264. | 'get_object_blob' '(' id=expression ',' ind=expression ')' -> ^(GET_OBJECT_BLOB $id $ind)
  265. | 'next_buff' '(' ')' -> ^(NEXT_BUFF)
  266. | 'buff_meter' '(' ')' -> ^(BUFF_METER)
  267. | 'buff_time_meter' '(' ')' -> ^(BUFF_TIME_METER)
  268. | 'is_buff_name' '(' n=STRING ')' -> ^(IS_BUFF_NAME $n)
  269.  
  270. ;
  271.  
  272. arrayIndex
  273. : s=IDENT '[' expression ']' -> ^(INDEX IDENT expression)
  274. ;
  275.  
  276. //----------------------------------------------------------------------
  277. // LEXER
  278.  
  279. TYPE
  280. : 'void'
  281. | 'int'
  282. ;
  283.  
  284. IDENT
  285. : (LETTER | '_') (LETTER | DIGIT | '_')*
  286. ;
  287.  
  288. STRING
  289. // : '"' ( LETTER | DIGIT )* '"'
  290. : '"'
  291. { StringBuilder b = new StringBuilder(); }
  292. ( '"' '"' { b.appendCodePoint('"');}
  293. | c=~('"'|'\r'|'\n') { b.appendCodePoint(c);}
  294. )*
  295. '"'
  296. { setText(b.toString()); }
  297. ;
  298.  
  299. INT : DIGIT+
  300. ;
  301.  
  302. fragment DIGIT
  303. : '0'..'9'
  304. ;
  305.  
  306. fragment LETTER
  307. : ('a'..'z' | 'A'..'Z')
  308. ;
  309.  
  310. fragment NEWLINE
  311. : '\r'|'\n'
  312. ;
  313.  
  314. MULTILINE_COMMENT : '/*' .* '*/' {$channel = HIDDEN;} ;
  315. LINECOMMENT : '//' ~('\r'|'\n')* NEWLINE {$channel=HIDDEN;}
  316. ;
  317. WS : (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel = HIDDEN;};
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement