%{ // ********************************************************************** // // Copyright (c) 2003-2015 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #include #include #if defined(_MSC_VER) && defined(ICE_64) // // '=' : conversion from 'size_t' to 'int', possible loss of data // The result of fread() is a size_t and gets inserted into an int // # pragma warning( 4 : 4267 ) // // 'initializing' : conversion from '__int64' to 'int', possible loss of data // Puts a pointer-difference into an int // # pragma warning( 4 : 4244 ) #endif using namespace std; #ifdef _MSC_VER # ifdef yywrap # undef yywrap # define yywrap() 1 # endif # define YY_NO_UNISTD_H #endif #ifdef __SUNPRO_CC # ifdef yywrap # undef yywrap # define yywrap() 1 # endif # ifdef ICE_64 # pragma error_messages(off,truncwarn) # endif #endif #define YY_INPUT(buf, result, maxSize) parser->getInput(buf, result, maxSize) %} WS [ \t\v\f\r] NL [\n] %option noyywrap %option always-interactive %% "//" { // C++-style comment int c; do { c = yyinput(); } while(c != '\n' && c != EOF); } "/*" { // C-style comment while(true) { int c = yyinput(); if(c == '*') { int next = yyinput(); if(next == '/') { break; } else { unput(next); } } else if(c == EOF) { parser->warning("EOF in comment"); break; } } } "help" { return TOK_HELP; } "quit"|"exit" { return TOK_EXIT; } "ls" { return TOK_LIST; } "lr" { return TOK_LIST_RECURSIVE; } "mkfile" { return TOK_CREATE_FILE; } "mkdir" { return TOK_CREATE_DIR; } "pwd" { return TOK_PWD; } "cd" { return TOK_CD; } "cat" { return TOK_CAT; } "write" { return TOK_WRITE; } "rm" { return TOK_RM; } {WS}*(\\{WS}*{NL})? { size_t len = strlen(yytext); for(size_t i = 0; i < len; ++i) { if(yytext[i] == '\\') { parser->continueLine(); } } } {NL}|; { return ';'; } \" { // "..."-type strings string s; while(true) { char c = static_cast(yyinput()); if(c == '"') { break; } else if(c == EOF) { parser->warning("EOF in string"); break; } else if(c == '\\') { char next = static_cast(yyinput()); switch(next) { case '\\': case '"': { s += next; break; } case 'n': { s += '\n'; break; } case 'r': { s += '\r'; break; } case 't': { s += '\t'; break; } case 'v': { s += '\v'; break; } case 'f': { s += '\f'; break; } default: { s += c; unput(next); } } } else { s += c; } } yylvalp->clear(); yylvalp->push_back(s); return TOK_STRING; } \' { // '...'-type strings string s; while(true) { char c = static_cast(yyinput()); if(c == '\'') { break; } else if(c == EOF) { parser->warning("EOF in string"); break; } else { s += c; } } yylvalp->clear(); yylvalp->push_back(s); return TOK_STRING; } . { // Simple strings string s; s += yytext[0]; while(true) { char c = static_cast(yyinput()); if(c == EOF) { break; } else if(isspace(c) || c == ';') { unput(c); break; } s += c; } yylvalp->clear(); yylvalp->push_back(s); return TOK_STRING; } %%