aboutsummaryrefslogtreecommitdiff
path: root/src/lex.l
diff options
context:
space:
mode:
authorShinya Sato <shinnya.sato@gmail.com>2021-11-02 16:05:52 +0900
committerShinya Sato <shinnya.sato@gmail.com>2021-11-02 16:05:52 +0900
commit0df7f6fa71cea5de0e041df80854d307930e418d (patch)
tree229c696c48e97c14b44eb85b7d4057de8867f2f7 /src/lex.l
parenta2aabb706c95bc7189633f6efef8325428d09630 (diff)
downloadinpla-0df7f6fa71cea5de0e041df80854d307930e418d.tar.gz
inpla-0df7f6fa71cea5de0e041df80854d307930e418d.zip
v0.5.1
Diffstat (limited to 'src/lex.l')
-rw-r--r--src/lex.l193
1 files changed, 193 insertions, 0 deletions
diff --git a/src/lex.l b/src/lex.l
new file mode 100644
index 0000000..85bf522
--- /dev/null
+++ b/src/lex.l
@@ -0,0 +1,193 @@
+%{
+#include <stdio.h>
+#include <stdlib.h>
+#include "linenoise/linenoise.h"
+
+#undef YY_INPUT
+#define YY_INPUT(buf,result,max_size) result = mygetinput(buf, max_size);
+
+static int mygetinput(char *buf, int size) {
+ char *line;
+ if (feof(yyin)) return YY_NULL;
+
+ if (yyin!=stdin) {
+ int len;
+ char ch;
+ for (len = 0; len < size; len++) {
+ ch = getc(yyin);
+ if (ch == EOF)
+ break;
+ buf[len] = ch;
+ }
+ return len;
+ }
+
+ linenoiseSetMultiLine(1);
+ if (yylineno == 1) {
+ line = linenoise(">>> ");
+ } else {
+ line = linenoise("... ");
+ }
+ if(!line) return YY_NULL;
+ if(strlen(line) > size-2){
+ fprintf(stderr,"input line too long\n");
+ return YY_NULL;
+ }
+ sprintf(buf, "%s\n", line);
+ linenoiseHistoryAdd(line);
+ linenoiseHistorySave(".inpla.history.txt");
+ free(line);
+ return strlen(buf);
+}
+
+
+//#undef YY_INPUT
+//#define YYINPUT(buf, result, max_size) result = (c == EOF) ? YY_NULL : (buf[0] = c, 1);
+
+
+/************************************
+ Strings
+*************************************/
+#define MAX_STRING_LENGTH 1024
+static char ParseStringBuffer[MAX_STRING_LENGTH];
+static int nextPtr_ParseStringBuffer = 0;
+void Parse_StringBuffer_reInit() {
+ nextPtr_ParseStringBuffer = 0;
+}
+
+void Parse_addString(char ch) {
+ ParseStringBuffer[nextPtr_ParseStringBuffer] = ch;
+ nextPtr_ParseStringBuffer++;
+}
+
+char *Parse_closeStringBuffer() {
+ char *ret;
+ ParseStringBuffer[nextPtr_ParseStringBuffer]='\0';
+ ret = ParseStringBuffer;
+ return ret;
+}
+
+
+
+%}
+
+%option nounput
+%option yylineno
+%option noyywrap
+%x STRING_STATE COM_STATE
+%%
+<INITIAL>";" return (DELIMITER);
+<INITIAL>":" return (COLON);
+<INITIAL>"(" return (LP);
+<INITIAL>")" return (RP);
+<INITIAL>"{" return LC;
+<INITIAL>"}" return RC;
+<INITIAL>"[" return LB;
+<INITIAL>"]" return RB;
+<INITIAL>"," return (COMMA);
+<INITIAL>"><" return (CROSS);
+<INITIAL>"=>" return (TO);
+<INITIAL>"~" return (CNCT);
+<INITIAL>"-" return (SUB);
+<INITIAL>"|" return(PIPE);
+<INITIAL>"&" return(AMP);
+<INITIAL>"=" return(LD);
+<INITIAL>"==" return(EQUAL);
+<INITIAL>"!=" return(NE);
+<INITIAL>">" return(GT);
+<INITIAL>">=" return(GE);
+<INITIAL>"<" return(LT);
+<INITIAL>"<=" return(LE);
+<INITIAL>"+" return (ADD);
+<INITIAL>"*" return (MUL);
+<INITIAL>"/" return (DIV);
+<INITIAL>"%" return (MOD);
+<INITIAL>"_" return (ANY);
+<INITIAL>"<<" return (ABR);
+
+<INITIAL>"int" return(INT);
+
+<INITIAL>"let" return(LET);
+<INITIAL>"in" return(IN);
+<INITIAL>"end" return(END);
+
+<INITIAL>"where" return(WHERE);
+
+<INITIAL>"if" return(IF);
+<INITIAL>"then" return(THEN);
+<INITIAL>"else" return(ELSE);
+
+<INITIAL>"interface" return(INTERFACE);
+<INITIAL>"ifce" return(IFCE);
+
+<INITIAL>"prnat" return(PRNAT);
+<INITIAL>"free" return(FREE);
+<INITIAL>"exit" return(EXIT);
+
+<INITIAL>"rand" return(RAND);
+
+<INITIAL>"const" return(DEF);
+
+<INITIAL>"use" return(USE);
+
+<INITIAL>"*L" return(ANNOTATE_L);
+<INITIAL>"*R" return(ANNOTATE_R);
+<INITIAL>[a-z][a-zA-Z0-9_'\.]* { yylval.chval = strdup(yytext);
+ return (NAME);}
+<INITIAL>[A-Z][a-zA-Z0-9_'\.]* { yylval.chval = strdup(yytext);
+ return (AGENT);}
+<INITIAL>[0-9]+ { yylval.intval = atoi(yytext);
+ return (INT_LITERAL);}
+
+<INITIAL>"//"[^\n]* ; //comment
+<INITIAL>"/*" BEGIN(COM_STATE);
+<COM_STATE>. ;
+<COM_STATE>\n ;
+<COM_STATE>"*/" BEGIN INITIAL; //comment
+
+<INITIAL>\r\n ;
+<INITIAL>[\n|\r] ;
+<INITIAL>[ \t]+ ;
+<INITIAL><<EOF>> {return END_OF_FILE;}
+<INITIAL>\" {
+ Parse_StringBuffer_reInit();
+ BEGIN STRING_STATE;
+}
+
+<INITIAL>. {return yytext[0];}
+
+
+
+
+<STRING_STATE>\" {
+ yylval.chval = strdup(Parse_closeStringBuffer());
+ BEGIN INITIAL;
+ return STRING_LITERAL;
+}
+<STRING_STATE>\n {
+// Parse_addString('\n');
+yyerror("Unterminated string");
+BEGIN(INITIAL);
+return DELIMITER;
+}
+<STRING_STATE>\\\" Parse_addString('"');
+<STRING_STATE>\\n Parse_addString('\n');
+<STRING_STATE>\\t Parse_addString('\t');
+<STRING_STATE>\\\\ Parse_addString('\\');
+<STRING_STATE>. Parse_addString(yytext[0]);
+%%
+
+void pushFP(FILE *fp) {
+ yypush_buffer_state(yy_create_buffer(fp, YY_BUF_SIZE));
+}
+
+int popFP() {
+ yypop_buffer_state();
+ if (! YY_CURRENT_BUFFER ) {
+ yyterminate();
+ return 0;
+ }
+ return 1;
+}
+
+