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