You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
5.5 KiB
143 lines
5.5 KiB
(*
|
|
* Copyright (c) 2013- Facebook.
|
|
* All rights reserved.
|
|
*)
|
|
|
|
(* Lexer to support a parser of types *)
|
|
{
|
|
|
|
open CTypes_parser
|
|
|
|
let line_number = ref 1
|
|
let parentheses = ref 0
|
|
|
|
let parsed_tokens = Buffer.create 1
|
|
let log lexbuf = Buffer.add_char parsed_tokens ' '; Buffer.add_string parsed_tokens (Lexing.lexeme lexbuf)
|
|
let reset_log () = Buffer.reset parsed_tokens
|
|
let get_log () = Buffer.contents parsed_tokens
|
|
|
|
let attr_par = ref 0
|
|
let attr_buf = Buffer.create 1
|
|
let reset_attr_buf () = Buffer.reset attr_buf
|
|
let log_attr_buf lexbuf =
|
|
Buffer.add_string parsed_tokens (Lexing.lexeme lexbuf);
|
|
Buffer.add_string attr_buf (Lexing.lexeme lexbuf)
|
|
let get_attr_buf () = Buffer.contents attr_buf
|
|
|
|
|
|
}
|
|
|
|
let lowerletter = ['a'-'z']
|
|
let upperletter = ['A'-'Z']
|
|
|
|
let underscore = '_'
|
|
let minus = '-'
|
|
let letter = lowerletter | upperletter
|
|
|
|
let digit = ['0'-'9']
|
|
let number = digit* | digit+ '.' digit* | digit* '.' digit+
|
|
let space = [' ' '\t']
|
|
|
|
let identifier = (letter | underscore) (letter | underscore | digit | ':')*
|
|
|
|
let anonymous_identifier = '(' 'a' 'n' 'o' 'n' 'y' 'm' 'o' 'u' 's' (letter | underscore | digit | ' ' | '.' | ':' | '/' | minus)* ')'
|
|
|
|
let nested_anonymous_identifier = (identifier ':' ':')+ (anonymous_identifier | identifier)
|
|
|
|
let nested_identifier = identifier (':' ':' identifier)+
|
|
|
|
let char = letter | digit
|
|
|
|
let hexa_digit = ['0'-'9' 'a'-'f']
|
|
let hexa = '0' 'x' hexa_digit*
|
|
|
|
let dir_sep = '/'
|
|
let dot = '.'
|
|
let extension = dot ('c' | 'h' | 'm')
|
|
let basename = (char | underscore | minus | dot )+
|
|
let filename = basename extension
|
|
let path = (dir_sep basename | basename)* filename
|
|
let attribute_digit = letter | underscore | digit | '(' | ')' | '\"' | ","
|
|
|
|
let newline = '\n'
|
|
|
|
rule token = parse
|
|
| space { log lexbuf; token lexbuf }
|
|
| newline { log lexbuf; incr line_number; token lexbuf }
|
|
| '.' { log lexbuf; DOT }
|
|
| ';' { log lexbuf; SEMICOLON }
|
|
| ':' { log lexbuf; COLON }
|
|
| ',' { log lexbuf; COMMA }
|
|
| '\'' { log lexbuf; SINGLE_QUOTE }
|
|
| '`' { log lexbuf; REV_QUOTE }
|
|
| '\"' { log lexbuf; DOUBLE_QUOTE }
|
|
| '^' { log lexbuf; CARRET }
|
|
| "class" { log lexbuf; CLASS }
|
|
| "struct" { log lexbuf; STRUCT }
|
|
| "union" { log lexbuf; UNION }
|
|
| "enum" { log lexbuf; ENUM }
|
|
| "unsigned" { log lexbuf; UNSIGNED }
|
|
| "signed" { log lexbuf; SIGNED }
|
|
| "void" { log lexbuf; VOID }
|
|
| "char" { log lexbuf; CHAR }
|
|
| "short" { log lexbuf; SHORT }
|
|
| "int" { log lexbuf; INT }
|
|
| "long" { log lexbuf; LONG }
|
|
| "_Bool" { log lexbuf; UND_BOOL }
|
|
| "__uint16_" { log lexbuf; UND_UND_UINT16_ }
|
|
| "__uint16_t" { log lexbuf; UND_UND_UINT16_T }
|
|
| "__uint32_" { log lexbuf; UND_UND_UINT32_ }
|
|
| "__uint32_t" { log lexbuf; UND_UND_UINT32_T }
|
|
| "__int32_t" { log lexbuf; UND_UND_INT32_T }
|
|
| "__int64_t" { log lexbuf; UND_UND_INT64_T }
|
|
| "__uint64_t" { log lexbuf; UND_UND_UINT64_T }
|
|
| "UInt8" { log lexbuf; UINT8 }
|
|
| "UInt16" { log lexbuf; UINT16 }
|
|
| "UInt32" { log lexbuf; UINT32 }
|
|
| "UInt64" { log lexbuf; UINT64 }
|
|
| "float" { log lexbuf; FLOAT }
|
|
| "double" { log lexbuf; DOUBLE }
|
|
| "volatile" { log lexbuf; VOLATILE }
|
|
| "*volatile" { log lexbuf; STARVOLATILE }
|
|
| "<builtin fn type>" { log lexbuf; BUILTIN_FN_TYPE}
|
|
| "inline" { log lexbuf; INLINE }
|
|
| "typename" { log lexbuf; TYPENAME }
|
|
| "const" { log lexbuf; CONST }
|
|
| "*const" { log lexbuf; STARCONST }
|
|
| "__strong" { log lexbuf; UND_UND_STRONG }
|
|
| "__unsafe_unretained" { log lexbuf; UND_UND_UNSAFE_UNRETAINED }
|
|
| "__weak" { log lexbuf; UND_UND_WEAK }
|
|
| "__autoreleasing" { log lexbuf; UND_UND_AUTORELEASING }
|
|
| "*__strong" { log lexbuf; STAR_UND_UND_STRONG }
|
|
| "*__unsafe_unretained" { log lexbuf; STAR_UND_UND_UNSAFE_UNRETAINED }
|
|
| "*__weak" { log lexbuf; STAR_UND_UND_WEAK }
|
|
| "*__autoreleasing" { log lexbuf; STAR_UND_UND_AUTORELEASING }
|
|
| "noexcept" { log lexbuf; NOEXCEPT }
|
|
| "restrict" { log lexbuf; RESTRICT }
|
|
| '%' { log lexbuf; PERCENT }
|
|
| '&' { log lexbuf; AMPERSAND }
|
|
| '!' { log lexbuf; EXCLAMATION }
|
|
| '=' { log lexbuf; EQUAL }
|
|
| '-' { log lexbuf; MINUS }
|
|
| '+' { log lexbuf; PLUS }
|
|
| '<' { log lexbuf; LEFT_CHEVRON }
|
|
| '>' { log lexbuf; RIGHT_CHEVRON }
|
|
| '(' { log lexbuf; incr parentheses; LEFT_PARENTHESIS }
|
|
| ')' { log lexbuf; decr parentheses; RIGHT_PARENTHESIS }
|
|
| '[' { log lexbuf; LEFT_SQBRACKET }
|
|
| ']' { log lexbuf; RIGHT_SQBRACKET }
|
|
| '{' { log lexbuf; LEFT_BRACE }
|
|
| '}' { log lexbuf; RIGHT_BRACE }
|
|
| '*' { log lexbuf; STAR }
|
|
| '|' { log lexbuf; PIPE }
|
|
| '/' { log lexbuf; SLASH }
|
|
| '\\' { log lexbuf; BACKSLASH }
|
|
| hexa as s { log lexbuf; HEXA (s) }
|
|
| number as n { log lexbuf; NUMBER n }
|
|
| identifier as s { log lexbuf; IDENT (s) }
|
|
| anonymous_identifier as s { log lexbuf; ANONYM_IDENT (s) }
|
|
| nested_identifier as s { log lexbuf; NESTED_IDENT (s) }
|
|
| nested_anonymous_identifier as s { log lexbuf; NESTED_ANONYM_IDENT (s) }
|
|
| eof { EOF }
|
|
|