%{ /* * 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; } { \" { ++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;