updating ir
[henge/webcc.git] / src / apc / lexer_lex.rl
old mode 100644 (file)
new mode 100755 (executable)
index 234e941..f7eb429
-/* Ragel State Machine for tokenizing text */
-#include <stdio.h>
-#include <string.h>
-#include <apc/parser.tab.h>
-
-extern void lexer_pushtok(int, YYSTYPE);
-
-int lexer_lex(const char*);
-int ipow(int, int);
-int ttov(const char* str, int);
-uint64_t ttor(const char* str, int);
-char* ttos(const char* str, int);
-
-
-#define MAX_TOK_LEN 64
-#define MAX_TOKENS 16
-#define MAX_STR_SIZE (MAX_TOK_LEN * MAX_TOKENS)
-#define $($)#$
-#define PUSHTOK(TOK,LFUNC,UTYPE)                       \
-  do {                                                 \
-    printf("PUSHTOK(" $(TOK) $(LFUNC) $(UTYPE) ")\n"); \
-    tok_t = TOK;                                       \
-    yylval.UTYPE = LFUNC(ts, p-ts);                    \
-    lexer_pushtok(tok_t, yylval);                      \
-    ++ntok;                                            \
-  } while (0)
-
-%%{
-  machine token_matcher;
-
-  # set up yylval and tok_t to be pushed to stack
-  action set_ref  { PUSHTOK(REF, ttor, ref); }
-  action set_val  { PUSHTOK(NUM, ttov, val); }
-  action set_name { PUSHTOK(NAME, ttos, str); }
-  action set_ts   { ts = p; }
-  action lex_error {printf("input error: character %c in filename %s is invalid\n", fc, str);}
-
-  # instantiate machines for each possible token
-  ref = '0x' xdigit+ %set_ref;
-  val = digit+ %set_val;
-  name = alpha+ %set_name;
-  tok = ref | val | name;
-  segment = (tok . '_') %set_ts;
-
- main := segment* . tok $lerr(lex_error);
-}%%
-
-
-%%write data;
-
-/* Scan filename and push the its tokens
-   onto the stack */
-int lexer_lex (const char* str)
-{
-  const char *p, *pe, *ts, *eof;
-  int  cs, tok_t, ntok = 0;
-  printf ("Lexing: %s\n",str);
-  p = ts = str;
-  pe = p + strlen(str);
-  %%write init;
-  %%write exec;
-  printf ("Lexed %i tokens\n",ntok);
-  return ntok;
-}
-
-int ipow(int base, int exp)
-{
-  int result = 1;
-  while (exp)
-    {
-      if (exp & 1)
-        result = result * base;
-      exp = exp >> 1;
-      base *= base;
-    }
-
-  return result;
-}
-
-/*  Token to Value */
-int ttov(const char* str, int len)
-{
-  int i, val = 0;
-
-  for (i = 0; i < len; i++)
-    {
-      val += ((str[len - (i + 1)] - '0') * ipow(10,i));
-    }
-
-  return val;
-}
-
-uint64_t ttor(const char* str, int len)
-{
-  int i;
-  uint64_t num = 0;
-
-  for (i = 0; i < len; i++)
-    {
-      num += ((str[len - (i + 1)] - '0') * ipow(10,i));
-    }
-
-  return num;
-}
-
-char* ttos(const char* str, int len)
-{
-  int i;
-  char token_buf[MAX_TOK_LEN];
-
-  memmove(token_buf, str, len);
-  token_buf[len+1] = '\0';
-
-  return strdup(token_buf);
-}
+/* Ragel State Machine for tokenizing text */\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <apc/parser.tab.h>\r
+\r
+extern void lexer_pushtok(int, YYSTYPE);\r
+\r
+int lexer_lex(const char*);\r
+int ipow(int, int);\r
+int ttov(const char* str, int);\r
+uint64_t ttor(const char* str, int);\r
+char* ttos(const char* str, int);\r
+\r
+\r
+#define MAX_TOK_LEN 64\r
+#define MAX_TOKENS 16\r
+#define MAX_STR_SIZE (MAX_TOK_LEN * MAX_TOKENS)\r
+#define $($)#$\r
+#define PUSHTOK(TOK,LFUNC,UTYPE)                       \\r
+  do {                                                 \\r
+    printf("PUSHTOK(" $(TOK) $(LFUNC) $(UTYPE) ")\n"); \\r
+    tok_t = TOK;                                       \\r
+    yylval.UTYPE = LFUNC(ts, ts-p-1);                  \\r
+    lexer_pushtok(tok_t, yylval);                      \\r
+    ++ntok;                                            \\r
+  } while (0)\r
+\r
+%%{\r
+  machine token_matcher;\r
+\r
+  # set up yylval and tok_t to be pushed to stack\r
+  action set_ref  { PUSHTOK(REF, ttor, ref); }\r
+  action set_val  { PUSHTOK(NUM, ttov, val); }\r
+  action set_name { PUSHTOK(NAME, ttos, str); }\r
+  action set_ts   { ts = p; }\r
+  action lex_error {printf("input error: character %c in filename %s is invalid\n", fc, str);}\r
+\r
+  # instantiate machines for each possible token\r
+  ref = '0x'. xdigit+ . '_'  %set_ref;\r
+  val = digit+ . '_' %set_val;\r
+  name = alpha+ . '_' %set_name;\r
+  tok = (ref | val | name) %set_ts;\r
+\r
+ main := alpha+ @set_name;\r
+}%%\r
+\r
+\r
+%%write data;\r
+/* Scan filename and push the its tokens\r
+   onto the stack */\r
+int lexer_lex (const char* str)\r
+{\r
+  const char *p, *pe, *ts, *eof;\r
+  int  cs, tok_t, ntok = 0;\r
+  printf ("Lexing: %s\n",str);\r
+  p = ts = str;\r
+  pe = p + strlen(str);\r
+  printf("p = %s \n", p);\r
+  %%write init;\r
+  %%write exec;\r
+  printf ("Lexed %i tokens\n",ntok);\r
+  return ntok;\r
+}\r
+\r
+int ipow(int base, int exp)\r
+{\r
+  int result = 1;\r
+  while (exp)\r
+    {\r
+      if (exp & 1)\r
+        result = result * base;\r
+      exp = exp >> 1;\r
+      base *= base;\r
+    }\r
+\r
+  return result;\r
+}\r
+\r
+/*  Token to Value */\r
+int ttov(const char* str, int len)\r
+{\r
+  int i, val = 0;\r
+\r
+  for (i = 0; i < len; i++)\r
+    {\r
+      val += ((str[len - (i + 1)] - '0') * ipow(10,i));\r
+    }\r
+\r
+  return val;\r
+}\r
+\r
+uint64_t ttor(const char* str, int len)\r
+{\r
+  int i;\r
+  uint64_t num = 0;\r
+\r
+  for (i = 0; i < len; i++)\r
+    {\r
+      num += ((str[len - (i + 1)] - '0') * ipow(10,i));\r
+    }\r
+\r
+  return num;\r
+}\r
+\r
+char* ttos(const char* str, int len)\r
+{\r
+  int i;\r
+  char token_buf[MAX_TOK_LEN];\r
+\r
+  memmove(token_buf, str, len);\r
+  token_buf[len+1] = '\0';\r
+\r
+  return strdup(token_buf);\r
+}\r