source: cpp/frams/vm/framscript.l @ 348

Last change on this file since 348 was 348, checked in by Maciej Komosinski, 9 years ago
  • explicit c_str() in SString instead of (const char*) cast
  • genetic converters and GenMan? are now thread-local which enables multi-threaded simulator separation
  • Property svn:eol-style set to native
File size: 4.7 KB
RevLine 
[163]1%{
[335]2// This file is a part of the Framsticks SDK.
3// Copyright (C) 2002-2015  Maciej Komosinski and Szymon Ulatowski.  See LICENSE.txt for details.
[163]4// Refer to http://www.framsticks.com/ for further information.
5
6#include "framscript-defs.h"
7#include "framscript.tab.cpp.h"
8#include <math.h>
9
10#define YY_INPUT(buf,result,maxsize) {result=trctx.in->Vread(buf,1,maxsize);}
11#define YY_NEVER_INTERACTIVE 1
12
[224]13static SString quoteMultiline(const SString &src);
[221]14
[163]15%}
16
17%option noyywrap
18%x asmcode
19%x asmcode2
20%x comment
[224]21%x multiline
[163]22
23%%
24
25\$[0-9a-fA-F]+ {int i; sscanf(yytext+1,"%x",&i); framscriptlval.setInt(i); return CONSTANT;}
260x[0-9a-fA-F]+ {int i; sscanf(yytext+2,"%x",&i); framscriptlval.setInt(i); return CONSTANT;}
27[0-9]+\.[0-9]*    {framscriptlval.setDouble(atof(yytext)); return CONSTANT;}
28[0-9]+            {framscriptlval.setInt(atoi(yytext)); return CONSTANT;}
29[0-9]+\.[0-9]*[eE][+-]?[0-9]+    {framscriptlval.setDouble(atof(yytext)); return CONSTANT;}
30[0-9]+*[eE][+-]?[0-9]+           {framscriptlval.setDouble(atof(yytext)); return CONSTANT;}
31"null"            {framscriptlval.setEmpty(); return CONSTANT;}
32\"([^\\\"]|\\.)*\" {framscriptlval.setString(SString(yytext+1,yyleng-2));return CONSTANT;}
[224]33\"\"\"             {trctx.tmp=""; trctx.multilimit='\"'; BEGIN multiline;}
34"'''"              {trctx.tmp=""; trctx.multilimit='\''; BEGIN multiline;}
[332]35"@line "[0-9]+\n   {trctx.line=atol(yytext+6);trctx.linechanged=true;}
36"@file "[^\n\t\r]+\n {trctx.srcname=SString(yytext+6,yyleng-7);trctx.namechanged=true;}
[163]37
38[a-zA-Z_][a-zA-Z0-9_]* { int t=lookupToken(yytext);
39                         if (t>=0) return t;
40                         else
41                            {
42                            framscriptlval.setString(yytext);
43                            return framscriptIsObjectName(yytext)?OBJNAME:IDENT;
44                            }
45                       }
46"=="               return EQUAL;
47"<>"               return NOT_EQUAL;
48"!="               return NOT_EQUAL;
49">="               return GEQUAL;
50"<="               return LEQUAL;
51
52"+="                return ASSIGN_ADD;
53"-="                return ASSIGN_SUB;
54"*="                return ASSIGN_MUL;
55"/="                return ASSIGN_DIV;
56"%="                return ASSIGN_MOD;
57
58"++"                return PLUSPLUS;
59"--"                return MINUSMINUS;
60
61"&&"                return LOGIC_AND;
62"||"                return LOGIC_OR;
63
64"<<"                return LSHIFT;
65">>"                return RSHIFT;
66
[332]67<INITIAL,asmcode,asmcode2>\/\/.*\n         {trctx.line++;trctx.linechanged=true;} // komentarz jednoliniowy
[163]68<INITIAL,asmcode,asmcode2>\/\/[^\n]*       ;               // komentarz ale nie ma potem \n
69
70<INITIAL>\/\*       BEGIN comment;
[332]71<comment>\n         {trctx.line++;trctx.linechanged=true;}
[163]72<comment>\*\/       BEGIN 0;
73<comment>.          ;
[224]74<multiline>.*       {
75                    char* end=strstr(yytext,trctx.multilimit=='\"' ? "\"\"\"" : "'''");
76                    if (end)
77                       {
78                       trctx.tmp+=SString(yytext,end-yytext);
79                       framscriptlval.setString(quoteMultiline(trctx.tmp));
80                       yyless((end-yytext)+3);
81                       BEGIN 0;
82                       return CONSTANT;
83                       }
[221]84                    else
[224]85                       trctx.tmp+=SString(yytext,yyleng);
[221]86                    }
[332]87<multiline>\n       {trctx.line++; trctx.linechanged=true; trctx.tmp+="\n";}
[163]88[ \t\r\f]           ;
[332]89\n                  {trctx.line++; trctx.linechanged=true;}
[163]90.                   return yytext[0];
91
92"asm"[ \t\n\r]*"{"  {
93                    BEGIN asmcode;
94                    char *t=yytext;
95                    while(t=strchr(t+1,'\n')) trctx.line++;
[332]96                    trctx.linechanged=true;
[163]97                    return ASM;
98                    }
99<asmcode>.*\n {
100              char *t=yytext;
[332]101              trctx.line++; trctx.linechanged=true;
[163]102              while ((*t==' ')||(*t=='\t')) t++;
103              if (*t=='}') {yyless((t-yytext)+1); BEGIN 0; return '}';}
104              char *e=yytext+yyleng-1;
105              while (e[-1]=='\r') e--;
106              framscriptlval.setString(SString(t,e-t));
107              return ASMLINE;
108              }
109
110%%
[221]111
[224]112//exclusively for multiline, but it should not be needed, there is some unexpected difference between quoting \n and \" in framscript parsing (TODO)
113static SString quoteMultiline(const SString &src)
[221]114{
115int len=src.len();
116SString ret((len*11)/10+10);
[348]117const char*t=src.c_str();
[221]118while(len>0)
119        {
[224]120        switch(*t)
121            {
122            case '\"': ret+="\\\""; break;
123            case '\\': ret+="\\\\"; break;
124            default: ret+=*t;
125            }
[221]126        t++; len--;
127        }
128return ret;
129}
130
[163]131void framscript_init_lex()
132{
133BEGIN 0;
134yyrestart(0);
135}
136
137void framscript_cleanup_lex()
138{
139yy_delete_buffer(yy_current_buffer);
140}
Note: See TracBrowser for help on using the repository browser.