/* * * ProLinga-Validate * * Copyright (C) 2002-2008 Xobas Software. * All rights reserved. * * This file is part of ProLinga-Validate. * * ProLinga-Validate is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProLinga-Validate is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProLinga-Validate. If not, see . * * More information is available at the following addresses: * * Website : http://www.prolinga.org * * Email : prolinga-list@prolinga.org * * */ %{ #include "ValCommon.h" #include "ValParser.h" #include "LogicCommands.hpp" //extern char* yylval; //char tempVal[255]; int length; void clip_left(char *str); void remove_meta(char *str); void clip_left(char *str) { int i, j; int len = strlen(str); for (i = 0; i < len && isspace(str[i]); ++i); //for (j = 0; j < len - 1 && i > 0; ++j) for (j = 0; j < len && i > 0; ++j) { str[j] = str[i++]; } } void remove_meta(char *str) { int i, str_len, last_pos; /* Init */ str_len = strlen(str); last_pos = 0; for (i = 0; i < str_len; i++) { if ((str[i] == '\\') && (str[i+1] == '\"')) { /* Skip */ } else { str[last_pos] = str[i]; last_pos++; } } /* Terminate string */ if (last_pos != str_len) str[last_pos] = '\0'; } %} rbl [(] rbr [)] whitespace [ \t] eos [\n] bos ^{whitespace}* word [^ \t\n"\\]+ string \"[^"]*["\n] builtin ({rbl}(({string}|{word})[,]*)*{rbr}) aoid {word}{builtin}? emptyline ^{whitespace}*{eos} %% /* Keyword Tokens : Logic Commands */ {bos}COMMENT { yylval.numval = LCMD_COMMENT; return CMT; } {bos}CONTROL { yylval.numval = LCMD_CONTROL; return LCMD; } {bos}SCREEN { yylval.numval = LCMD_SCREEN; return LCMD; } {bos}MESSAGE { yylval.numval = LCMD_MESSAGE; return LCMD; } {bos}CLEAR { yylval.numval = LCMD_CLEAR; return LCMD; } {bos}LET { yylval.numval = LCMD_LET; return LCMD; } {bos}CALL { yylval.numval = LCMD_CALL; return LCMD; } {bos}TABLE { yylval.numval = LCMD_TABLE; return LCMD; } {bos}DISPLAY { yylval.numval = LCMD_DISPLAY; return LCMD; } {bos}IF { yylval.numval = LCMD_IF; return LCMD; } {bos}RETURN { yylval.numval = LCMD_RETURN; return LCMD; } {bos}ERROR { yylval.numval = LCMD_ERROR; return LCMD; } {bos}LIST { yylval.numval = LCMD_LIST; return LCMD; } {bos}FOREVER { yylval.numval = LCMD_FOREVER; return LCMD; } {bos}ENDIF { yylval.numval = LCMD_ENDIF; return LCMD; } {bos}ELSE { yylval.numval = LCMD_ELSE; return LCMD; } {bos}ENDFOR { yylval.numval = LCMD_ENDFOR; return LCMD; } {bos}BREAK { yylval.numval = LCMD_BREAK; return LCMD; } {bos}CONTINUE { yylval.numval = LCMD_CONTINUE; return LCMD; } {bos}TEXT { yylval.numval = LCMD_TEXT; return LCMD; } {bos}RESPONSE { yylval.numval = LCMD_RESPONSE; return LCMD; } {bos}NIL { yylval.numval = LCMD_NIL; return LCMD; } {bos}SLEEP { yylval.numval = LCMD_SLEEP; return LCMD; } {bos}RUN { yylval.numval = LCMD_RUN; return LCMD; } {bos}PARAMETER { yylval.numval = LCMD_PARAMETER; return LCMD; } {bos}ELSEIF { yylval.numval = LCMD_ELSEIF; return LCMD; } {bos}FOR { yylval.numval = LCMD_FOR; return LCMD; } {bos}SQL { yylval.numval = LCMD_SQL; return LCMD; } {bos}FOREACH { yylval.numval = LCMD_FOREACH; return LCMD; } {bos}XML { yylval.numval = LCMD_XML; return LCMD; } {bos}REPOSITORY { yylval.numval = LCMD_REPOSITORY; return LCMD; } {bos}THREAD { yylval.numval = LCMD_THREAD; return LCMD; } {bos}PROGRESS { yylval.numval = LCMD_PROGRESS; return LCMD; } {bos}FOCUS { yylval.numval = LCMD_FOCUS; return LCMD; } {bos}TRANSACTION { yylval.numval = LCMD_TRANSACTION; return LCMD; } {bos}DATAMODEL { yylval.numval = LCMD_DATAMODEL; return LCMD; } /* Invalid Logic Command */ {bos}{aoid} { clip_left(yytext); yylval.sval = strdup(yytext); return ILCMD; } {bos}{string} { clip_left(yytext); yylval.sval = strdup(yytext); return ILCMD; } /* Application Object Id */ {aoid} { yylval.sval = strdup(yytext); return AOID; } /* String */ {string} { if (yytext[yyleng-2] == '\\') { /* Remove meta char */ //yytext[yyleng-2] = ' '; //yyunput(yytext[yyleng-1], yytext); yyless(yyleng-1); yymore(); } else { /* Remove meta chars */ remove_meta(yytext); yylval.sval = strdup(yytext); return AOID; } } /* Begin of Statement */ {bos} { yylval.sval = strdup(yytext); return BOS; } /* End of Statement */ {eos} { yylval.sval = strdup(yytext); return EOS; } {whitespace} { /* Ignore */ } {emptyline} { /* Ignore */ } %% int yywrap() { return 1; }