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