The Pedigree Project 0.1
lexer.l
1%{
2
3#include <stdio.h>
4#include <stdlib.h>
5#include <unistd.h>
6#include "cmd.h"
7#include "parser.h"
8
9typedef YYSTYPE type_t;
10
11type_t text_var();
12type_t num_var();
13type_t unicode_var();
14type_t hex_var();
15
16%}
17
18%%
19
20#.*$ {}
21\n {return NEWLINE;}
22\\. {yylval.c = yytext[1]; return QUOTED_CHAR;}
23\" {return QUOTE;}
24U\+[0-9a-fA-F]+ {yylval = unicode_var(); return CODE_POINT;}
25CTRL {return CTRL;}
26SHIFT {return SHIFT;}
27CTRL-SHIFT {return CTRL_SHIFT;}
28ALT {return ALT;}
29ALTGR {return ALTGR;}
30CTRL-ALT {return CTRL_ALT;}
31SHIFT-ALT {return SHIFT_ALT;}
32CTRL-SHIFT-ALT {return CTRL_SHIFT_ALT;}
33CTRL-ALTGR {return CTRL_ALTGR;}
34SHIFT-ALTGR {return SHIFT_ALTGR;}
35CTRL-SHIFT-ALTGR {return CTRL_SHIFT_ALTGR;}
36COMBINE {return COMBINE;}
37SET-COMBINE {return SET_COMBINE;}
38DEFINE {return DEFINE;}
39\[ {return OPEN_SQ;}
40\] {return CLOSE_SQ;}
410x[0-9A-Fa-f]+ {yylval = hex_var(); return NUM;}
42[0-9]+ {yylval = num_var(); return NUM;}
43[a-zA-Z0-9_-]+ {yylval = text_var(); return STRING;}
44[ \t] {}
45<<eof>> {return END;}
46
47%%
48
49type_t text_var()
50{
51 type_t toRet;
52 if ((size_t) yyleng >= sizeof(toRet.str))
53 {
54 fprintf(stderr, "Keymap token is too long.\n");
55 exit(1);
56 }
57 memcpy(toRet.str, yytext, yyleng);
58 toRet.str[yyleng] = '\0';
59 return toRet;
60}
61
62type_t num_var()
63{
64 type_t toRet;
65 toRet.n = atoi(yytext);
66 return toRet;
67}
68
69type_t unicode_var()
70{
71 type_t toRet;
72 toRet.n = strtoul(yytext+2, 0, 16);
73 return toRet;
74}
75
76type_t hex_var()
77{
78 type_t toRet;
79 toRet.n = strtoul(yytext, 0, 16);
80 return toRet;
81}