diff options
author | Ying Wang <wangying@android.com> | 2016-01-12 19:57:20 +0100 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2016-01-12 19:57:20 +0100 |
commit | f607e5a0bc1c1481331dc32ac203fc66770dec71 (patch) | |
tree | e210c2265dc0c2d22ccf313a7e83a6db79136126 /edify/lexer.ll | |
parent | Merge "updater: Add a function to check first block" (diff) | |
parent | Merge "Rename .l/.y to .ll/.yy" (diff) | |
download | android_bootable_recovery-f607e5a0bc1c1481331dc32ac203fc66770dec71.tar android_bootable_recovery-f607e5a0bc1c1481331dc32ac203fc66770dec71.tar.gz android_bootable_recovery-f607e5a0bc1c1481331dc32ac203fc66770dec71.tar.bz2 android_bootable_recovery-f607e5a0bc1c1481331dc32ac203fc66770dec71.tar.lz android_bootable_recovery-f607e5a0bc1c1481331dc32ac203fc66770dec71.tar.xz android_bootable_recovery-f607e5a0bc1c1481331dc32ac203fc66770dec71.tar.zst android_bootable_recovery-f607e5a0bc1c1481331dc32ac203fc66770dec71.zip |
Diffstat (limited to 'edify/lexer.ll')
-rw-r--r-- | edify/lexer.ll | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/edify/lexer.ll b/edify/lexer.ll new file mode 100644 index 000000000..fb2933bee --- /dev/null +++ b/edify/lexer.ll @@ -0,0 +1,112 @@ +%{ +/* + * 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 <string.h> + +#include "expr.h" +#include "yydefs.h" +#include "parser.h" + +int gLine = 1; +int gColumn = 1; +int gPos = 0; + +// TODO: enforce MAX_STRING_LEN during lexing +char string_buffer[MAX_STRING_LEN]; +char* string_pos; + +#define ADVANCE do {yylloc.start=gPos; yylloc.end=gPos+yyleng; \ + gColumn+=yyleng; gPos+=yyleng;} while(0) + +%} + +%x STR + +%option noyywrap + +%% + + +\" { + BEGIN(STR); + string_pos = string_buffer; + yylloc.start = gPos; + ++gColumn; + ++gPos; +} + +<STR>{ + \" { + ++gColumn; + ++gPos; + BEGIN(INITIAL); + *string_pos = '\0'; + yylval.str = strdup(string_buffer); + yylloc.end = gPos; + return STRING; + } + + \\n { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\n'; } + \\t { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\t'; } + \\\" { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\"'; } + \\\\ { gColumn += yyleng; gPos += yyleng; *string_pos++ = '\\'; } + + \\x[0-9a-fA-F]{2} { + gColumn += yyleng; + gPos += yyleng; + int val; + sscanf(yytext+2, "%x", &val); + *string_pos++ = val; + } + + \n { + ++gLine; + ++gPos; + gColumn = 1; + *string_pos++ = yytext[0]; + } + + . { + ++gColumn; + ++gPos; + *string_pos++ = yytext[0]; + } +} + +if ADVANCE; return IF; +then ADVANCE; return THEN; +else ADVANCE; return ELSE; +endif ADVANCE; return ENDIF; + +[a-zA-Z0-9_:/.]+ { + ADVANCE; + yylval.str = strdup(yytext); + return STRING; +} + +\&\& ADVANCE; return AND; +\|\| ADVANCE; return OR; +== ADVANCE; return EQ; +!= ADVANCE; return NE; + +[+(),!;] ADVANCE; return yytext[0]; + +[ \t]+ ADVANCE; + +(#.*)?\n gPos += yyleng; ++gLine; gColumn = 1; + +. return BAD; |