diff options
Diffstat (limited to 'edify/lexer.l')
-rw-r--r-- | edify/lexer.l | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/edify/lexer.l b/edify/lexer.l new file mode 100644 index 000000000..4faef5da0 --- /dev/null +++ b/edify/lexer.l @@ -0,0 +1,97 @@ +%{ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "expr.h" +#include "parser.h" + +int gLine = 1; +int gColumn = 1; + +// TODO: enforce MAX_STRING_LEN during lexing +char string_buffer[MAX_STRING_LEN]; +char* string_pos; +%} + +%x STR + +%option noyywrap + +%% + + +\" { + ++gColumn; + BEGIN(STR); + string_pos = string_buffer; +} + +<STR>{ + \" { + ++gColumn; + BEGIN(INITIAL); + *string_pos = '\0'; + yylval.str = strdup(string_buffer); + return STRING; + } + + \\n { gColumn += yyleng; *string_pos++ = '\n'; } + \\t { gColumn += yyleng; *string_pos++ = '\t'; } + \\\" { gColumn += yyleng; *string_pos++ = '\"'; } + \\\\ { gColumn += yyleng; *string_pos++ = '\\'; } + + \\x[0-9a-fA-F]{2} { + gColumn += yyleng; + int val; + sscanf(yytext+2, "%x", &val); + *string_pos++ = val; + } + + \n { + ++gLine; + gColumn = 1; + *string_pos++ = yytext[0]; + } + + . { + ++gColumn; + *string_pos++ = yytext[0]; + } +} + +if { gColumn += yyleng; return IF; } +then { gColumn += yyleng; return THEN; } +else { gColumn += yyleng; return ELSE; } +endif { gColumn += yyleng; return ENDIF; } + +[a-zA-Z0-9_:/]+ { + gColumn += yyleng; + yylval.str = strdup(yytext); + return STRING; +} + +\&\& { gColumn += yyleng; return AND; } +\|\| { gColumn += yyleng; return OR; } +== { gColumn += yyleng; return EQ; } +!= { gColumn += yyleng; return NE; } + +[+(),!;] { gColumn += yyleng; return yytext[0]; } + +[ \t]+ gColumn += yyleng; + +(#.*)?\n { ++gLine; gColumn = 1; } + +. return BAD; |