about summary refs log tree commit diff
path: root/src/libexpr/lexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr/lexer.l')
-rw-r--r--src/libexpr/lexer.l78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/libexpr/lexer.l b/src/libexpr/lexer.l
new file mode 100644
index 000000000000..705b31b41a77
--- /dev/null
+++ b/src/libexpr/lexer.l
@@ -0,0 +1,78 @@
+%option reentrant bison-bridge bison-locations
+%option noyywrap
+%option never-interactive
+
+
+%{
+#include <string.h>
+#include <aterm2.h>
+#include "parser-tab.h"
+
+static void initLoc(YYLTYPE * loc)
+{
+    loc->first_line = 1;
+    loc->first_column = 1;
+}
+
+static void adjustLoc(YYLTYPE * loc, const char * s, size_t len)
+{
+    while (len--) {
+       switch (*s++) {
+       case '\n': 
+           ++loc->first_line;
+           loc->first_column = 1;
+           break;
+       default:
+           ++loc->first_column;
+       }
+    }
+}
+
+#define YY_USER_INIT initLoc(yylloc)
+#define YY_USER_ACTION adjustLoc(yylloc, yytext, yyleng);
+
+%}
+
+
+ID          [a-zA-Z\_][a-zA-Z0-9\_\']*
+INT         [0-9]+
+STR         \"[^\n\"]*\"
+PATH        [a-zA-Z0-9\.\_\-\+]*(\/[a-zA-Z0-9\.\_\-\+]+)+
+URI         [a-zA-Z][a-zA-Z0-9\+\-\.]*\:[a-zA-Z0-9\%\/\?\:\@\&\=\+\$\,\-\_\.\!\~\*\']*
+
+
+%%
+
+
+if          { return IF; }
+then        { return THEN; }
+else        { return ELSE; }
+assert      { return ASSERT; }
+let         { return LET; }
+rec         { return REC; }
+
+\=\=        { return EQ; }
+\!\=        { return NEQ; }
+\&\&        { return AND; }
+\|\|        { return OR; }
+\-\>        { return IMPL; }
+
+{ID}        { yylval->t = ATmake("<str>", yytext); return ID; /* !!! alloc */ }
+{INT}       { return INT; }
+{STR}       { int len = strlen(yytext);
+              yytext[len - 1] = 0;
+              yylval->t = ATmake("<str>", yytext + 1);
+              yytext[len - 1] = '\"';
+              return STR; /* !!! alloc */
+            }
+{PATH}      { yylval->t = ATmake("<str>", yytext); return PATH; /* !!! alloc */ }
+{URI}       { yylval->t = ATmake("<str>", yytext); return URI; /* !!! alloc */ }
+
+[ \t\n]+    /* eat up whitespace */
+\#[^\n]*    /* single-line comments */
+\/\*(.|\n)*\*\/  /* long comments */
+
+.           return yytext[0];
+
+
+%%