Advertisement
Guest User

Untitled

a guest
Mar 26th, 2015
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.98 KB | None | 0 0
  1. PARSER
  2.  
  3. %token <bool> BOOL
  4. %token AND OR NOT
  5. %token LPAREN RPAREN
  6. %token EOL
  7.  
  8. %left AND OR /* lowest precedence */
  9. %nonassoc NOT /* highest precedence */
  10.  
  11. %start <bool> main
  12.  
  13. %%
  14.  
  15. main:
  16. | e = expr EOL
  17. { e }
  18.  
  19. expr:
  20. | i = BOOL
  21. { i }
  22. | LPAREN e = expr RPAREN
  23. { e }
  24. | e1 = expr AND e2 = expr
  25. { e1 && e2 }
  26. | e1 = expr OR e2 = expr
  27. { e1 || e2 }
  28. | NOT e = expr %prec NOT
  29. { not e }
  30.  
  31. LEXER
  32.  
  33.  
  34. {
  35. open Parser
  36.  
  37. exception Error of string
  38.  
  39. }
  40.  
  41. rule line = parse
  42. | ([^'\n']* '\n') as line
  43. { line }
  44. | eof
  45. { exit 0 }
  46.  
  47. and token = parse
  48. | [' ' '\t']
  49. { token lexbuf }
  50. | '\n'
  51. { EOL }
  52. | "AND"
  53. { AND }
  54. | "OR"
  55. { OR }
  56. | "NOT"
  57. { NOT }
  58. | '('
  59. { LPAREN }
  60. | ')'
  61. { RPAREN }
  62. | ['a'-'z' 'A'-'Z' '_' '0'-'9']+ as i
  63. { BOOL (Hashtbl.mem Globals.flags_tbl i) }
  64. | eof
  65. { exit 0 }
  66. | _
  67. { raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement