diff options
Diffstat (limited to 'src/nsgenbind-lexer.l')
-rw-r--r-- | src/nsgenbind-lexer.l | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l new file mode 100644 index 0000000..4bdc803 --- /dev/null +++ b/src/nsgenbind-lexer.l @@ -0,0 +1,154 @@ +%{ + +/* lexer for the binding generation config file + * + * This file is part of nsgenbind. + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + * Copyright 2012 Vincent Sanders <vince@netsurf-browser.org> + */ + +#include <stdbool.h> +#include <stdio.h> +#include <string.h> + +#include "nsgenbind-parser.h" +#include "nsgenbind-ast.h" + +#define YY_USER_ACTION yylloc->first_line = yylloc->last_line; \ + yylloc->first_column = yylloc->last_column + 1; \ + yylloc->last_column += yyleng; + +%} + +/* lexer options */ +%option never-interactive +%option yylineno +%option bison-bridge +%option bison-locations +%option nodefault +%option warn +%option prefix="nsgenbind_" +%option nounput +%option noinput +%option noyywrap + +/* other Unicode “space separator” */ +USP (\xe1\x9a\x80)|(\xe1\xa0\x8e)|(\xe2\x80[\x80-\x8a])|(\xe2\x80\xaf)|(\xe2\x81\x9f)|(\xe3\x80\x80) + +/* non breaking space \u00A0 */ +NBSP (\xc2\xa0) + +/* Line separator \u2028 */ +LS (\xe2\x80\xa8) + +/* paragraph separator \u2029 */ +PS (\xe2\x80\xa9) + +whitespace ([ \t\v\f]|{NBSP}|{USP}) + +lineend ([\n\r]|{LS}|{PS}) + +multicomment \/\*(([^*])|(\*[^/]))*\*\/ + +quotedstring [^\"\\\n\r] + +identifier [A-Z_a-z][0-9A-Z_a-z]* + +other [^\t\n\r 0-9A-Z_a-z] + +cblockopen \%\{ + +cblockclose \%\} + +/* used for #include directive */ +poundsign ^{whitespace}*# + +%x cblock + +%x incl + +%% + +{whitespace} ++yylloc->last_column;/* nothing */ + +{lineend} if (yytext[0] != '\r') { + /* update position counts */ + ++yylloc->last_line; + yylloc->last_column = 0; + } + + /* terminals */ + +webidlfile return TOK_IDLFILE; + +hdrcomment return TOK_HDR_COMMENT; + +preamble return TOK_PREAMBLE; + +binding return TOK_BINDING; + +interface return TOK_INTERFACE; + +type return TOK_TYPE; + +private return TOK_PRIVATE; + +operation return TOK_OPERATION; + +{cblockopen} BEGIN(cblock); + +{identifier} { + /* A leading "_" is used to escape an identifier from + * looking like a reserved word terminal. + */ + yylval->text = (yytext[0] == '_') ? strdup(yytext + 1) : strdup(yytext); + return TOK_IDENTIFIER; + } + +\"{quotedstring}*\" yylval->text = strndup(yytext + 1, yyleng - 2 ); return TOK_STRING_LITERAL; + +{multicomment} /* nothing */ + +{poundsign}include BEGIN(incl); + +{other} return (int) yytext[0]; + +. /* nothing */ + +<cblock>[^\%]* yylval->text = strdup(yytext); return TOK_CCODE_LITERAL; +<cblock>{cblockclose} BEGIN(INITIAL); +<cblock>\% yylval->text = strdup(yytext); return TOK_CCODE_LITERAL; + + +<incl>[ \t]*\" /* eat the whitespace and open quotes */ + +<incl>[^\t\n\"]+ { + /* got the include file name */ + yyin = genbindopen(yytext); + + if (! yyin) { + fprintf(stderr, "Unable to open include %s\n", yytext); + exit(3); + } + yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE )); + + BEGIN(INITIAL); + } + +<incl>\n BEGIN(INITIAL); + +<incl>. /* nothing */ + +<<EOF>> { + yypop_buffer_state(); + + if ( !YY_CURRENT_BUFFER ) { + yyterminate(); + } else { + BEGIN(incl); + } + + } + +%% |