%{/* Lex code for the FS parser In this Web-accessible version, the parsing of control structures, the hanling of multiple buffers, and the following functions have been removed. */ static void prAndRunCommand(); static void setLanguage(); void fs_include (char *filename, int isRunMode); void fs_scanString (const char *s); bool fs_unputVarValue (const char *variable); bool fs_unputIfVarValue (const char *variable); extern unsigned int sleep(unsigned int seconds); static dynStr Command, CGstring; %} ANY (.|\n) DIGIT [0-9] ISALNUM_ [A-Za-z0-9_¡-ÿ] S ([ \t\r ]|" ")+ s ([ \n\t\r ]|" ")* NUM ({DIGIT}+("."{DIGIT}*)?) IDENT1 ({ISALNUM_}|"#"({ISALNUM_}|".")) IDENTx ({ISALNUM_}|[\-/.~#%$@'!?&]|"\\"{ANY}|":_") IDENTz ({ISALNUM_}|[\-.~#%$@'!?&]|"\\"{ANY}|":_") IDENTn ({IDENTx}|"&"[a-z]+";"|"&#"{DIGIT}+";"|";"{IDENTz}|"#*"|"|") URL "://"({IDENTn}|[*+=]|","{IDENTx}|":"[0-9])+ IDENT {IDENT1}({IDENTn})*{URL}? IDENTforSH [A-Za-z0-9_\-/.:~]+ VARVALUESTR ("\$"{ISALNUM_}{IDENTn}*) NUMERAL ("-"?{NUM}) DATE_STR ({DIGIT}{DIGIT}?"/"{DIGIT}{DIGIT}?"/"{DIGIT}{DIGIT}{DIGIT}{DIGIT}) IDENT__OPER ({IDENT}|"!="|"<="|"=<"|"=>"|"<=>"|"="|"=<"|">="|">") ANNOT_ALL "(^"([^\^]|(\^[^\)]))*"^)" ANNOT_END ([^\^]|(\^[^\)]))*"^)" DELIM_STR "$("([^\)]|(\)[^$]))*")$" DELIM_END ([^\)]|(\)[^$]))*")$" CODE_STR "@("([^\)]|(\)[^@]))*")@" CODE_END ([^\)]|(\)[^@]))*")@" QSTR1 '([^'\\]|(\\{ANY}))*' QSTR1_END ([^'\\]|(\\{ANY}))*' QSTR2 \"([^"\\]|(\\{ANY}))*\" QSTR2_END ([^"\\]|(\\{ANY}))*\" QSTR ({QSTR1}|{QSTR2}) ASTR ({QSTR}|{ANNOT_ALL}|{DELIM_STR}|{CODE_STR}) ASTR-1 ({QSTR2}|{ANNOT_ALL}|{DELIM_STR}|{CODE_STR}) ANY_VALUE ({IDENT__OPER}|{QSTR}) DEF_ID ({IDENT}|{QSTR1}) C_COMMENT "/*"([^\*]|(\*[^\/]))*"*/" CPP_COMMENT "//"[^\n]* LISP_COMMENT ";;;"[^\n]* COMMENT ({C_COMMENT}|{CPP_COMMENT}|{LISP_COMMENT}) /*no (*...*) comment since a relation signature may be (*,*) */ %x SKIP_TEXT PRINT_TEXT C_COMM TAG_BODY ANNOT1 DELIM STR1 STR2 %x LIST_BODY LIST_STR1 ACTOR_BODY IF_EXPR WH_EXPR WH_BODY GR_PARAM %x CG_DEF CG_BODY CG_CTXT CG_CE %% "" {if (RunMode== -1) BEGIN(PRINT_TEXT); else BEGIN(SKIP_TEXT);} "" BEGIN(0); "" {setLanguage();BEGIN(0);} {ANY} {if (fstext[0]=='\n') LineNumber++; putc(fstext[0],OutputFp);} {ANY} {if (fstext[0]=='\n') LineNumber++;} "/*" BEGIN(C_COMM); /* | */ "\n" LineNumber++; "/*" putsWarning("Warning: \"/*\" found within \"/*...*/\" comment"); "*/" BEGIN(0); . ;/* more efficient than yyinput() */ <> {putsErr("Multi-line comment not closed: \"*/\" expected"); BEGIN(0); Command.clear();} "" ; "">" BEGIN(0); {QSTR} LineNumber+=nbLinesInStr(fstext); "\n" LineNumber++; . ; <> {putsErr("Tag not closed: '>' expected"); BEGIN(0); Command.clear();} {S} ; "\n" LineNumber++;/*not for CGs, ... since re-parsed elsewhere*/ {CPP_COMMENT} ;/* skip C++ line comments */ {LISP_COMMENT} ;/* skip Lisp line comments */ "->" return TO; "<=>" {if (!GetComm || !Run) return EQV; Command.add(fstext); } "<=" {if (!GetComm || !Run) return IMPB; Command.add(fstext); } "=>" {if (!GetComm || !Run) return IMP; Command.add(fstext); } "=<" {if (!GetComm || !Run) return LTE; Command.add(fstext); } ">=" {if (!GetComm || !Run) return GTE; Command.add(fstext); } "==" {if (!GetComm || !Run) return '='; Command.add(fstext); } "!=" {if (!GetComm || !Run) return NEQ; Command.add(fstext); } "/=" {if (!GetComm || !Run) return NEQ; Command.add(fstext); } "&&" {if (!GetComm || !Run) return AND; Command.add(fstext); } "and" {if (!GetComm || !Run) return AND; Command.add(fstext); } "||" {if (!GetComm || !Run) return OR; Command.add(fstext); } "or" {if (!GetComm || !Run) return OR; Command.add(fstext); } "not" {if (!GetComm || !Run) return '!'; Command.add(fstext); } "{(" {/*pr("Close Subtype Partition Beginning\n");*/ if (!GetComm || !Run) return CSPB; Command.add("{("); } ")}" {/*pr("Close Subtype Partition End\n");*/ if (!GetComm || !Run) return CSPE; Command.add(")}"); } "(^" BEGIN(ANNOT1); {ANNOT_END} {BEGIN(0); if (!GetComm || !Run) { LineNumber+=nbLinesInStr(fstext); fstext[fsleng-2]='\0'; return ANNOTATION; } Command+=" (^"; Command+=fstext; } <> {putsErr("Annotation not closed: \"^)\" expected"); BEGIN(0); return ANNOTATION;} "$(" BEGIN(DELIM); {DELIM_END} {BEGIN(0); if (!GetComm || !Run) { LineNumber+=nbLinesInStr(fstext); fstext[fsleng-2]='\0'; return STRING; } Command+=" $("; Command+=fstext; } <> {putsErr("Unterminated string: \")$\" expected");BEGIN(0); return STRING;} {QSTR1} {if (!GetComm || !Run) { LineNumber+=nbLinesInStr(fstext); if (!strpbrk(fstext," \n\r\t")) return IDENTIFIER; memmove(fstext,fstext+1,fsleng-1);/*in FS, content is used*/ fstext[fsleng-1]='\0'; return STRING; } Command.add(fstext); } \" BEGIN(STR2); /*comment closing the other \" of this line*/ {QSTR2_END} {BEGIN(0); if (!GetComm || !Run) { LineNumber+=nbLinesInStr(fstext); fstext[fsleng-1]='\0'; return STRING; } Command+=" \""; Command+=fstext; } <> {putsErr("Unterminated double quoted string");BEGIN(0); return STRING;} "("{DATE_STR}")" {if (GetComm && Run) Command.add(fstext); else {fstext[fsleng-1]='\0'; return CREATION_DATE;}} {DATE_STR} {if (!GetComm || !Run) return DATE; Command.add(fstext); } {NUMERAL} {if (!GetComm || !Run) return NUMBER; Command.add(fstext); /*this rule must be before {IDENT} */ } "(" {if ((InputLanguage=='F') || ((InputLanguage!='I') && (InputLanguage!='K'))) { if (!GetComm || !Run) return '('; Command.add(fstext); } else { CGstring.clear(); CGstring.append("("); BracketDepth=1; BEGIN(LIST_BODY); } } "'(" {CGstring.append("'("); ++BracketDepth;} "(" {CGstring.append('('); ++BracketDepth;} ")" {pr("LIST_BODY')'\n"); CGstring.append(')'); if (!--BracketDepth) { BEGIN(0); if (!GetComm || !Run) return CG; Command.add(CGstring); }} {ASTR-1} {CGstring.append(fstext);} "'" {CGstring.append(fstext); if (InputLanguage!='K') BEGIN(LIST_STR1); } {QSTR1_END} {CGstring.append(fstext); BEGIN(LIST_BODY); } <> {putsErr("Unterminated string in list"); BEGIN(0); Command.clear(); return CG;} {IDENT} {CGstring.append(fstext);/*because of "//" in URLs*/ } {COMMENT} ; {ANY} {CGstring.append(fstext[0]);} <> {putsErr("Unbalanced '('"); CGstring.clear(); BEGIN(0); Command.clear(); return CG;} "<"/[A-Za-z] {if (InputLanguage!='I') BEGIN(TAG_BODY); else {CGstring.clear(); CGstring.append("<"); BracketDepth=1; BEGIN(ACTOR_BODY);}} "<" {if (InputLanguage!='I') { if (!GetComm || !Run) return '<'; Command.add(fstext); } else { CGstring.clear(); CGstring.append("<"); BracketDepth=1; BEGIN(ACTOR_BODY); } } "<" {CGstring.append('<'); ++BracketDepth;} ">" {CGstring.append('>'); if (!--BracketDepth) { BEGIN(0); if (!GetComm || !Run) return CG; Command.add(CGstring); }} {ASTR} {CGstring.append(fstext);} {IDENT} {CGstring.append(fstext);/*because of "//" in URLs*/ } {COMMENT} ; {ANY} {CGstring.append(fstext[0]);} <> {putsErr("Unbalanced '<'"); CGstring.clear(); BEGIN(0); Command.clear(); return CG;} "type"{S}{DEF_ID} {CGstring=fstext; BEGIN(CG_DEF);} "relation"{S}{DEF_ID} {CGstring=fstext; BEGIN(CG_DEF);} "function"{S}{DEF_ID} {CGstring=fstext; BEGIN(CG_DEF);} {ANNOT_ALL} {CGstring.append(fstext);} "[" {BracketDepth=1; CGstring.append('['); BEGIN(CG_BODY);} ";" {yyless(0); BEGIN(0); if (GetComm && Run) Command.add(CGstring); else{CGstring.prepend('[');CGstring.append(']');return CG;}} . {CGstring.append(fstext[0]);} <> {putsErr("Unterminated definition"); CGstring.clear(); BEGIN(0); Command.clear(); return CG;} ("!"{s}|"~"{s})"[" {BracketDepth=1; CGstring.clear();CGstring.append("![");BEGIN(CG_BODY);} "[" {BracketDepth=1; CGstring.clear();CGstring.append('['); BEGIN(CG_BODY);} "[" {CGstring.append('['); ++BracketDepth;} "]"{s}"(" {CGstring.append(fstext); if (!--BracketDepth) BEGIN(CG_CTXT);} "]" {CGstring.append(']'); if (!--BracketDepth) { BEGIN(0); if (GetComm && Run) Command.add(CGstring); else { if (islower(CGstring[0])) { CGstring.prepend('['); CGstring.append(']'); } return CG; }}} {ASTR} {CGstring.append(fstext);} {IDENT} {CGstring.append(fstext);/*because of "//" in URLs*/ } {COMMENT} ; {ANY} {CGstring.append(fstext[0]); } <> {putsErr("Unbalanced '['"); CGstring.clear(); BEGIN(0); Command.clear(); return CG;} ")" {CGstring.append(')'); BEGIN(0); if (GetComm && Run) Command.add(CGstring); else { if (islower(CGstring[0])) { CGstring.prepend('['); CGstring.append(']'); } return CG; }} "@(" {CGstring.append("@("); BEGIN(CG_CE);} ")@" {CGstring.append(")@"); BEGIN(CG_CTXT);} {ANY} {CGstring.append(fstext[0]);/*for "@(..))@" to be parsed*/} {ANY} {CGstring.append(fstext[0]);} <> {putsErr("Unbalanced '('"); CGstring.clear(); BEGIN(0); Command.clear(); return CG;} "{" {if (!GetComm || !Run) return '{'; "}" {if (!GetComm || !Run) return '}'; "no user;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> no user\n\n"); CurrentUserIsKnown=false;GdbrCurrentUser=null;}} "user" {if (!GetComm || !Run) return USER; Command.add(fstext);} "e-mail" {if (!GetComm || !Run) return EMAIL; Command.add(fstext); /*no need for {S} since no name at beginning of commands in fs.l, just identifiers*/} "userId" {if (!GetComm || !Run)return USER_ID; Command.add(fstext);} "unprefixed identifiers allowed;" {UnprefixedIdentsAllowed=true;} "no unprefixed identifiers;" {UnprefixedIdentsAllowed=false;} "default creator:" {if (!Run) return DEFAULT_CREATORS; if (!GetComm) {AreDefaultTermCreators=false; return DEFAULT_CREATORS;} Command.add(fstext);} "spec" {if (!GetComm || !Run) return SPEC; Command.add(fstext); } "mod" {if (!GetComm || !Run) return MOD; Command.add(fstext); } "del" {if (!GetComm || !Run) return DEL; Command.add(fstext); } "delGraph" {if (!GetComm ||!Run)return DEL_GRAPH;Command.add(fstext); } "echo" {if (!GetComm || !Run) return PRINT; Command.add(fstext); } "print" {if (!GetComm || !Run) return PRINT; Command.add(fstext); } "unprefixed variables;" {if (Run) VarValuesAreLikeIdentifiers=true; } "prefixed variables;" {if (Run) VarValuesAreLikeIdentifiers=false;} "exit;" {fswrap(); return NO_RELOAD;} "no reload;" {if (ReloadingThisFile) {if (OutputLanguage!='R') fpr(OutputFp,"//Already loaded\n"); fswrap(); return NO_RELOAD;}} "no \"already the case\" warning;" {if (Run) NoAlreadyTheCaseMessages=true;} "\"already the case\" warnings;" {if (Run) NoAlreadyTheCaseMessages=false;} "no reasoning trace;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> no trace\n\n"); WithReasoningTrace=0;}} "reasoning trace;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> trace\n\n"); WithReasoningTrace=100; fflush(ErrorFp); }} "reasoning trace "{DIGIT}+";" {if (Run) {fstext[strlen(fstext)-1]='\0'; if (GetComm) fpr(OutputFp,"\n\n> trace %s\n\n",fstext+16); if (sscanf(fstext+16,"%d",&WithReasoningTrace)!=1) putsErr("Not an integer: %s",fstext+16); fflush(ErrorFp); }} "trace;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> trace\n\n"); WithTrace=1; fflush(OutputFp); fflush(ErrorFp); }} "trace "{DIGIT}+";" {if (Run){fstext[strlen(fstext)-1]='\0'; if (GetComm) fpr(OutputFp,"\n\n> trace %s\n\n",fstext+6); if (sscanf(fstext+6,"%d",&WithTrace)!=1) putsErr("Invalid number: %s",fstext+6); fflush(ErrorFp); }} "ambiguityAcceptation "{NUMERAL}";" {if (Run) {fstext[strlen(fstext)-1]='\0'; if (GetComm) fpr(OutputFp,"\n\n> ambiguityAcceptation %s\n\n", fstext+21); if (sscanf(fstext+21,"%d",&AmbiguityAcceptation)!=1) putsErr("Invalid number: %s",fstext+21);} } "sleep "{NUMERAL}";" {if (Run) {fstext[strlen(fstext)-1]='\0'; if (GetComm)fpr(OutputFp,"\n\n> sleep %s\n\n",fstext+6); if (sscanf(fstext+6,"%u",&Nsleep)==1) sleep(Nsleep); else putsErr("Invalid number: %s",fstext+6); }} "gets;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> gets\n\n"); fgets(GName,250,stdin);}} "run mode;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> run mode\n\n"); RunMode=1; GetComm=true;}} "load mode;" {if (Run){RunMode=0; GetComm=false;}} "display mode;" {if (Run){if (GetComm)fpr(OutputFp,"\n\n> display mode\n\n"); RunMode=-1;GetComm=false;}} "no trace;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> no trace\n\n"); WithTrace=0;}} "no storage;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> no storage\n\n"); NoStorage=true;}} "storage;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> storage\n\n"); NoStorage=false;}} "use names;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> use names\n\n"); NamesAllowed=true;}} "no names;" {if (Run){if (GetComm) fpr(OutputFp,"\n\n> no names\n\n"); NamesAllowed=false;}} "prDefCreators;" {if (Run) {if (GetComm) fpr(OutputFp,"\n\n> prDefCreators\n\n"); fpr(OutputFp,"Default creators: "); yyleng=0; for (;yyleng<(int)(DefaultTermCreators.length());yyleng++) { prUserFromRef(DefaultTermCreators[yyleng]); fpr(OutputFp," "); } fpr(OutputFp,"\n");}} "include "{IDENT}";" {if (Run){fstext[fsleng-1]='\0'; if (GetComm) fpr(OutputFp,"\n\n> include %s\n\n",fstext+8); fs_include(fstext+8,RunMode);}} "run "{IDENT}";" {if (Run){fstext[fsleng-1]='\0'; if (GetComm) fpr(OutputFp,"\n\n> run %s\n\n",fstext+4); fs_include(fstext+4,1);}} "load "{IDENT}";" {if (Run){fstext[fsleng-1]='\0'; if (GetComm) fpr(OutputFp,"\n\n> load %s\n\n",fstext+5); fs_include(fstext+5,0);}} "display "{IDENT}";" {if (Run){fstext[fsleng-1]='\0'; if (GetComm) fpr(OutputFp,"\n\n> display %s\n\n",fstext+8); fs_include(fstext+8,-1);}} {IDENT}":=" {if (GetComm && Run) Command.add(fstext); else{*(strstr(fstext,":="))='\0'; tr("Ident:%s.\n",fstext); return VAR__SET_TO;}} {IDENT}{S}":=" {if (GetComm && Run) Command.add(fstext); else{*(strchr(fstext,' '))='\0'; tr("Ident:%s.\n",fstext); return VAR__SET_TO;}} {IDENT} {//tr("Ident:%s.\n",fstext); if (!Run) return IDENTIFIER; if (GetComm) Command.add(fstext); else {if (NbVarValues && VarValuesAreLikeIdentifiers && fs_unputIfVarValue(fstext)) {} else return IDENTIFIER;}} ";" {IsPipableCommand=false; if (!Run) { return ';';} if (GetComm) { fflush(OutputFp);GetComm=false;/*here or in "if (Run)" ?*/ if (Command.size) { fpr(OutputFp,"\n\n>%s\n\n",Command.data); Command.append(';'); fs_scanString(Command.data); Command.clear(); } }else { if (RunMode==1) GetComm=true; return ';'; }} . {if (GetComm && Run) Command.add(fstext); else {/*pr("char:%c.\n",fstext[0]);*/ return fstext[0];}} %%