Advertisement
Guest User

Untitled

a guest
Jul 11th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 4.68 KB | None | 0 0
  1. lexer grammar CheepLexer;
  2.  
  3. options {
  4.     filter=true;
  5. }
  6.  
  7. tokens {
  8.     CURRENCY_SYMBOL;
  9.     VALUE;
  10.     AT_SYMBOL;
  11.     HASH_SYMBOL;
  12.     STATEMENT;
  13. }
  14.  
  15. @header {
  16.     require 'yaml'
  17. }
  18.  
  19. @init {
  20.     @statements = YAML::load(File.open( 'statements.yml' ))
  21.     @token_buffer = Array.new
  22.    
  23.     @got_statement = false
  24.     @statement_type = nil
  25.     @cheep_lang = :en
  26. }
  27.  
  28. @members {
  29.  
  30.     attr_reader :cheep_lang
  31.     attr_reader :statement_type
  32.  
  33.     def emit( token = @state.token )
  34.       token ||= create_token
  35.       @state.token = token
  36.       @token_buffer.push token
  37.       return token
  38.     end
  39.  
  40.     def advance_input
  41.         @state.token_start_position = @input.index
  42.         @state.token_start_column = @input.column
  43.         @state.token_start_line = @input.line
  44.         @state.channel=DEFAULT_CHANNEL;
  45.     end
  46.  
  47.     def next_token
  48.       loop do
  49.         if @token_buffer.empty?
  50.             @state.token = nil
  51.             @state.channel = DEFAULT_CHANNEL
  52.             @state.token_start_position = @input.index
  53.             @state.token_start_column = @input.column
  54.             @state.token_start_line = @input.line
  55.             @state.text = nil
  56.             @input.peek == EOF and return EOF_TOKEN
  57.             begin
  58.               token!
  59.  
  60.               case token = @state.token
  61.               when nil then emit
  62.               when SKIP_TOKEN then next
  63.               end
  64.             rescue NoViableAlternative => re
  65.               report_error( re )
  66.               recover( re )
  67.             rescue Error::RecognitionError => re
  68.               report_error( re )
  69.             end
  70.         elsif
  71.             tk = @token_buffer.shift
  72.             return tk if (tk != SKIP_TOKEN || tk != nil)
  73.         end
  74.       end
  75.     end
  76. }
  77.  
  78. WS
  79. @init {$channel=ANTLR3::HIDDEN_CHANNEL}
  80.     :  (' '|'\r'|'\t'|'\u000C'|'\n'|EOF)
  81.     ;
  82.  
  83. TWEET_VIA_STATEMENT
  84.     :   'via'
  85.         {@state.type = TWEET_VIA_STATEMENT; @state.token = nil; emit; advance_input;}
  86.         SPACES?
  87.         USER
  88.     ;
  89.  
  90. TWEET_RT_STATEMENT
  91.     :   'rt'
  92.         {@state.type = TWEET_RT_STATEMENT; @state.token = nil; emit; advance_input;}
  93.         SPACES?
  94.         USER
  95.     ;
  96.  
  97. TWEET_CC_STATEMENT
  98.     :   '/' SPACES? 'cc'
  99.         {@state.type = TWEET_CC_STATEMENT; @state.token = nil; emit; advance_input;}
  100.         SPACES? USER
  101.     ;
  102.  
  103. MONEY
  104.     :  (('us'|'u'|'r')? '$'|'\u20ac')
  105.         {@state.type = CURRENCY_SYMBOL; @state.token = nil; emit; advance_input;}
  106.         SPACES?
  107.         NUMBER
  108.         {@state.type = VALUE; @state.token = nil; emit; advance_input;}
  109.     ;
  110.  
  111. NUMBER
  112.     :  (('+'|'-') SPACES?)? ('0'..'9')+ (('.'|',') ('0'..'9')+)* WS {@state.text = self.text.strip}
  113.     ;
  114.  
  115. USER
  116.     :   '@'
  117.         {@state.type = AT_SYMBOL; @state.token = nil; emit; advance_input;}    
  118.         ('0'..'9'|('a'..'z')|('A'..'Z')|'_')+
  119.         {@state.type = USER; @state.token = nil; emit; advance_input;}
  120.     ;
  121.  
  122. HASH_TAG
  123.     :   '#'
  124.         {@state.type = HASH_SYMBOL; @state.token = nil; emit; advance_input;}
  125.         ~(' '|'\r'|'\t'|'\u000C'|'\n')+
  126.         {@state.type = HASH_TAG; @state.token = nil; emit; advance_input;}
  127.         (' '|'\r'|'\t'|'\u000C'|'\n')
  128.         {@state.type = WS; @state.channel=ANTLR3::HIDDEN_CHANNEL; @state.token = nil; emit; advance_input;}
  129.     ;
  130.  
  131. SYMBOL
  132.     :    '{' | '}' | '[' | ']' | '(' | ')' | '.' | '*' | ';' | '&' | ':' | ',' | '<' | '>' | '=' | '%' | '^' | '~'
  133.     ;
  134.  
  135. QUESTION
  136.     :    '?'
  137.     ;
  138.  
  139. EXCLAMATION
  140.     :    '!'
  141.     ;
  142.  
  143. TEXT
  144.     :   (LETTER|DIGIT)+
  145.         {   if !@got_statement
  146.               word = self.text
  147.               @statements.each do |key, inner|
  148.                 inner.each do |lang, value|
  149.                   if value.include?(word.downcase)
  150.                     @state.type = STATEMENT;
  151.                     @statement_type = key.to_sym
  152.                     @cheep_lang = lang.to_sym
  153.                     @got_statement = true;
  154.                     emit
  155.                     advance_input
  156.                     return
  157.                   end
  158.                 end
  159.               end
  160.             end }
  161.     ;
  162.  
  163. UNKNOWN
  164.     :  ~(' '|'\r'|'\t'|'\u000C'|'\n')+ (' '|'\r'|'\t'|'\u000C'|'\n'|EOF)
  165.     ;
  166.  
  167. fragment
  168. SPACES
  169.     :   (' '|'\r'|'\t'|'\u000C'|'\n')+
  170.         {@state.type = WS; @state.channel=ANTLR3::HIDDEN_CHANNEL; @state.token = nil; emit; advance_input;}
  171.     ;
  172.  
  173. fragment
  174. LETTER
  175.     :  '\u0024' |
  176.        '\u0041'..'\u005a' |
  177.        '\u005f' |
  178.        '\u0061'..'\u007a' |
  179.        '\u00c0'..'\u00d6' |
  180.        '\u00d8'..'\u00f6' |
  181.        '\u00f8'..'\u00ff' |
  182.        '\u0100'..'\u1fff' |
  183.        '\u3040'..'\u318f' |
  184.        '\u3300'..'\u337f' |
  185.        '\u3400'..'\u3d2d' |
  186.        '\u4e00'..'\u9fff' |
  187.        '\uf900'..'\ufaff'
  188.     ;
  189.  
  190. fragment
  191. DIGIT
  192.     :  '\u0030'..'\u0039' |
  193.        '\u0660'..'\u0669' |
  194.        '\u06f0'..'\u06f9' |
  195.        '\u0966'..'\u096f' |
  196.        '\u09e6'..'\u09ef' |
  197.        '\u0a66'..'\u0a6f' |
  198.        '\u0ae6'..'\u0aef' |
  199.        '\u0b66'..'\u0b6f' |
  200.        '\u0be7'..'\u0bef' |
  201.        '\u0c66'..'\u0c6f' |
  202.        '\u0ce6'..'\u0cef' |
  203.        '\u0d66'..'\u0d6f' |
  204.        '\u0e50'..'\u0e59' |
  205.        '\u0ed0'..'\u0ed9' |
  206.        '\u1040'..'\u1049'
  207.    ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement