Warning, /kdevelop/kdevelop-pg-qt/examples/cool/cool_lexer.ll is written in an unsupported language. File is not indexed.
0001 0002 %option c++ 0003 %option yyclass="cool::Lexer" 0004 %option noyywrap 0005 0006 0007 %{ 0008 0009 #define DONT_INCLUDE_FLEXLEXER 0010 #include "cool_lexer.h" 0011 0012 %} 0013 0014 0015 Whitespace [ \t\f\n] 0016 0017 %x IN_BLOCKCOMMENT 0018 0019 %% 0020 0021 /* whitespace, newlines and comments */ 0022 0023 {Whitespace}+ /* skip */ ; 0024 "--".* /* line comments, skip */ ; 0025 0026 "(*" BEGIN(IN_BLOCKCOMMENT); 0027 <IN_BLOCKCOMMENT>{ 0028 "*)" BEGIN(INITIAL); 0029 <<EOF>> return cool::Parser::Token_EOF; 0030 [\n] /* skip */ ; 0031 . /* skip */ ; 0032 } 0033 0034 0035 /* seperators */ 0036 0037 "(" return cool::Parser::Token_LPAREN; 0038 ")" return cool::Parser::Token_RPAREN; 0039 "{" return cool::Parser::Token_LBRACE; 0040 "}" return cool::Parser::Token_RBRACE; 0041 ";" return cool::Parser::Token_SEMICOLON; 0042 "," return cool::Parser::Token_COMMA; 0043 "." return cool::Parser::Token_DOT; 0044 "@" return cool::Parser::Token_AT; 0045 0046 0047 /* operators */ 0048 0049 "+" return cool::Parser::Token_PLUS; 0050 "-" return cool::Parser::Token_MINUS; 0051 "*" return cool::Parser::Token_STAR; 0052 "/" return cool::Parser::Token_SLASH; 0053 "=" return cool::Parser::Token_EQUAL; 0054 "<=" return cool::Parser::Token_LESS_EQUAL; 0055 "<" return cool::Parser::Token_LESS; 0056 ":" return cool::Parser::Token_COLON; 0057 "<-" return cool::Parser::Token_ARROW_LEFT; 0058 "=>" return cool::Parser::Token_ARROW_RIGHT; 0059 "~" return cool::Parser::Token_TILDE; 0060 "not" return cool::Parser::Token_NOT; 0061 "isvoid" return cool::Parser::Token_ISVOID; 0062 0063 0064 /* reserved words */ 0065 0066 "case" return cool::Parser::Token_CASE; 0067 "esac" return cool::Parser::Token_ESAC; 0068 "class" return cool::Parser::Token_CLASS; 0069 "Class" return cool::Parser::Token_CLASS; 0070 "else" return cool::Parser::Token_ELSE; 0071 "false" return cool::Parser::Token_FALSE; 0072 "if" return cool::Parser::Token_IF; 0073 "in" return cool::Parser::Token_IN; 0074 "fi" return cool::Parser::Token_FI; 0075 "inherits" return cool::Parser::Token_INHERITS; 0076 "let" return cool::Parser::Token_LET; 0077 "loop" return cool::Parser::Token_LOOP; 0078 "new" return cool::Parser::Token_NEW; 0079 "of" return cool::Parser::Token_OF; 0080 "pool" return cool::Parser::Token_POOL; 0081 "then" return cool::Parser::Token_THEN; 0082 "true" return cool::Parser::Token_TRUE; 0083 "while" return cool::Parser::Token_WHILE; 0084 0085 0086 /* literals */ 0087 0088 "\""([^"\\]|\\.)*"\"" return cool::Parser::Token_STRING; 0089 0090 [A-Z][a-zA-Z0-9_]* return cool::Parser::Token_TYPE; 0091 [a-z_][a-zA-Z0-9_]* return cool::Parser::Token_IDENTIFIER; 0092 [0-9]+ return cool::Parser::Token_INTEGER; 0093 0094 0095 /* everything else is not a valid lexeme */ 0096 0097 . return cool::Parser::Token_INVALID; 0098 0099 %% 0100 0101 namespace cool 0102 { 0103 0104 Lexer::Lexer( Parser *parser, char *contents ) 0105 { 0106 restart( parser, contents ); 0107 } 0108 0109 void Lexer::restart( Parser *parser, char *contents ) 0110 { 0111 m_parser = parser; 0112 m_locationTable = parser->tokenStream->locationTable(); 0113 m_contents = contents; 0114 m_tokenBegin = m_tokenEnd = 0; 0115 m_currentOffset = 0; 0116 0117 // check for and ignore the UTF-8 byte order mark 0118 unsigned char *ucontents = (unsigned char *) m_contents; 0119 if ( ucontents[0] == 0xEF && ucontents[1] == 0xBB && ucontents[2] == 0xBF ) 0120 { 0121 m_tokenBegin = m_tokenEnd = 3; 0122 m_currentOffset = 3; 0123 } 0124 0125 yyrestart(NULL); 0126 BEGIN(INITIAL); // is not set automatically by yyrestart() 0127 } 0128 0129 // reads a character, and returns 1 as the number of characters read 0130 // (or 0 when the end of the string is reached) 0131 int Lexer::LexerInput( char *buf, int /*max_size*/ ) 0132 { 0133 int c = m_contents[ m_currentOffset++ ]; 0134 0135 switch(c) 0136 { 0137 case '\r': 0138 c = '\n'; // only have one single line break character: '\n' 0139 if ( m_contents[m_currentOffset + 1] == '\n' ) 0140 { 0141 m_currentOffset++; 0142 m_tokenEnd++; 0143 } 0144 0145 // fall through 0146 case '\n': 0147 m_locationTable->newline( m_currentOffset ); 0148 break; 0149 0150 default: 0151 break; 0152 } 0153 0154 return (c == 0) ? 0 : (buf[0] = c, 1); 0155 } 0156 0157 } // end of namespace cool 0158