1%{
2/*
3 * Copyright (C) 2009 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include <string.h>
19#include <string>
20
21#include "edify/expr.h"
22#include "yydefs.h"
23#include "parser.h"
24
25int gLine = 1;
26int gColumn = 1;
27int gPos = 0;
28
29std::string string_buffer;
30
31#define ADVANCE do {yylloc.start=gPos; yylloc.end=gPos+yyleng; \
32                    gColumn+=yyleng; gPos+=yyleng;} while(0)
33
34%}
35
36%x STR
37
38%option noinput
39%option nounput
40%option noyywrap
41
42%%
43
44
45\" {
46    BEGIN(STR);
47    string_buffer.clear();
48    yylloc.start = gPos;
49    ++gColumn;
50    ++gPos;
51}
52
53<STR>{
54  \" {
55      ++gColumn;
56      ++gPos;
57      BEGIN(INITIAL);
58      yylval.str = strdup(string_buffer.c_str());
59      yylloc.end = gPos;
60      return STRING;
61  }
62
63  \\n   { gColumn += yyleng; gPos += yyleng; string_buffer.push_back('\n'); }
64  \\t   { gColumn += yyleng; gPos += yyleng; string_buffer.push_back('\t'); }
65  \\\"  { gColumn += yyleng; gPos += yyleng; string_buffer.push_back('\"'); }
66  \\\\  { gColumn += yyleng; gPos += yyleng; string_buffer.push_back('\\'); }
67
68  \\x[0-9a-fA-F]{2} {
69      gColumn += yyleng;
70      gPos += yyleng;
71      int val;
72      sscanf(yytext+2, "%x", &val);
73      string_buffer.push_back(static_cast<char>(val));
74  }
75
76  \n {
77      ++gLine;
78      ++gPos;
79      gColumn = 1;
80      string_buffer.push_back(yytext[0]);
81  }
82
83  . {
84      ++gColumn;
85      ++gPos;
86      string_buffer.push_back(yytext[0]);
87  }
88}
89
90if                ADVANCE; return IF;
91then              ADVANCE; return THEN;
92else              ADVANCE; return ELSE;
93endif             ADVANCE; return ENDIF;
94
95[a-zA-Z0-9_:/.]+ {
96  ADVANCE;
97  yylval.str = strdup(yytext);
98  return STRING;
99}
100
101\&\&              ADVANCE; return AND;
102\|\|              ADVANCE; return OR;
103==                ADVANCE; return EQ;
104!=                ADVANCE; return NE;
105
106[+(),!;]          ADVANCE; return yytext[0];
107
108[ \t]+            ADVANCE;
109
110(#.*)?\n          gPos += yyleng; ++gLine; gColumn = 1;
111
112.                 return BAD;
113