From c8abc4ec45ae9c5310097a02a406cd663e5457ea Mon Sep 17 00:00:00 2001 From: Ying Wang Date: Mon, 11 Jan 2016 18:14:17 -0800 Subject: Rename .l/.y to .ll/.yy Now to generate .cpp you need to use .ll/.yy. Bug: 26492989 Change-Id: Ib078e03b3b0758f7a62595c343e52ae856bcb33f --- edify/Android.mk | 4 +- edify/lexer.l | 112 -------------------------------------------- edify/lexer.ll | 112 ++++++++++++++++++++++++++++++++++++++++++++ edify/parser.y | 139 ------------------------------------------------------- edify/parser.yy | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 253 insertions(+), 253 deletions(-) delete mode 100644 edify/lexer.l create mode 100644 edify/lexer.ll delete mode 100644 edify/parser.y create mode 100644 edify/parser.yy diff --git a/edify/Android.mk b/edify/Android.mk index 9b859d42e..038dec088 100644 --- a/edify/Android.mk +++ b/edify/Android.mk @@ -3,8 +3,8 @@ LOCAL_PATH := $(call my-dir) edify_src_files := \ - lexer.l \ - parser.y \ + lexer.ll \ + parser.yy \ expr.cpp # diff --git a/edify/lexer.l b/edify/lexer.l deleted file mode 100644 index fb2933bee..000000000 --- a/edify/lexer.l +++ /dev/null @@ -1,112 +0,0 @@ -%{ -/* - * 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 - -#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; -} - -{ - \" { - ++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; 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 + +#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; +} + +{ + \" { + ++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; diff --git a/edify/parser.y b/edify/parser.y deleted file mode 100644 index 098a6370a..000000000 --- a/edify/parser.y +++ /dev/null @@ -1,139 +0,0 @@ -%{ -/* - * 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 -#include -#include - -#include "expr.h" -#include "yydefs.h" -#include "parser.h" - -extern int gLine; -extern int gColumn; - -void yyerror(Expr** root, int* error_count, const char* s); -int yyparse(Expr** root, int* error_count); - -struct yy_buffer_state; -void yy_switch_to_buffer(struct yy_buffer_state* new_buffer); -struct yy_buffer_state* yy_scan_string(const char* yystr); - -%} - -%locations - -%union { - char* str; - Expr* expr; - struct { - int argc; - Expr** argv; - } args; -} - -%token AND OR SUBSTR SUPERSTR EQ NE IF THEN ELSE ENDIF -%token STRING BAD -%type expr -%type arglist - -%parse-param {Expr** root} -%parse-param {int* error_count} -%error-verbose - -/* declarations in increasing order of precedence */ -%left ';' -%left ',' -%left OR -%left AND -%left EQ NE -%left '+' -%right '!' - -%% - -input: expr { *root = $1; } -; - -expr: STRING { - $$ = reinterpret_cast(malloc(sizeof(Expr))); - $$->fn = Literal; - $$->name = $1; - $$->argc = 0; - $$->argv = NULL; - $$->start = @$.start; - $$->end = @$.end; -} -| '(' expr ')' { $$ = $2; $$->start=@$.start; $$->end=@$.end; } -| expr ';' { $$ = $1; $$->start=@1.start; $$->end=@1.end; } -| expr ';' expr { $$ = Build(SequenceFn, @$, 2, $1, $3); } -| error ';' expr { $$ = $3; $$->start=@$.start; $$->end=@$.end; } -| expr '+' expr { $$ = Build(ConcatFn, @$, 2, $1, $3); } -| expr EQ expr { $$ = Build(EqualityFn, @$, 2, $1, $3); } -| expr NE expr { $$ = Build(InequalityFn, @$, 2, $1, $3); } -| expr AND expr { $$ = Build(LogicalAndFn, @$, 2, $1, $3); } -| expr OR expr { $$ = Build(LogicalOrFn, @$, 2, $1, $3); } -| '!' expr { $$ = Build(LogicalNotFn, @$, 1, $2); } -| IF expr THEN expr ENDIF { $$ = Build(IfElseFn, @$, 2, $2, $4); } -| IF expr THEN expr ELSE expr ENDIF { $$ = Build(IfElseFn, @$, 3, $2, $4, $6); } -| STRING '(' arglist ')' { - $$ = reinterpret_cast(malloc(sizeof(Expr))); - $$->fn = FindFunction($1); - if ($$->fn == NULL) { - char buffer[256]; - snprintf(buffer, sizeof(buffer), "unknown function \"%s\"", $1); - yyerror(root, error_count, buffer); - YYERROR; - } - $$->name = $1; - $$->argc = $3.argc; - $$->argv = $3.argv; - $$->start = @$.start; - $$->end = @$.end; -} -; - -arglist: /* empty */ { - $$.argc = 0; - $$.argv = NULL; -} -| expr { - $$.argc = 1; - $$.argv = reinterpret_cast(malloc(sizeof(Expr*))); - $$.argv[0] = $1; -} -| arglist ',' expr { - $$.argc = $1.argc + 1; - $$.argv = reinterpret_cast(realloc($$.argv, $$.argc * sizeof(Expr*))); - $$.argv[$$.argc-1] = $3; -} -; - -%% - -void yyerror(Expr** root, int* error_count, const char* s) { - if (strlen(s) == 0) { - s = "syntax error"; - } - printf("line %d col %d: %s\n", gLine, gColumn, s); - ++*error_count; -} - -int parse_string(const char* str, Expr** root, int* error_count) { - yy_switch_to_buffer(yy_scan_string(str)); - return yyparse(root, error_count); -} diff --git a/edify/parser.yy b/edify/parser.yy new file mode 100644 index 000000000..098a6370a --- /dev/null +++ b/edify/parser.yy @@ -0,0 +1,139 @@ +%{ +/* + * 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 +#include +#include + +#include "expr.h" +#include "yydefs.h" +#include "parser.h" + +extern int gLine; +extern int gColumn; + +void yyerror(Expr** root, int* error_count, const char* s); +int yyparse(Expr** root, int* error_count); + +struct yy_buffer_state; +void yy_switch_to_buffer(struct yy_buffer_state* new_buffer); +struct yy_buffer_state* yy_scan_string(const char* yystr); + +%} + +%locations + +%union { + char* str; + Expr* expr; + struct { + int argc; + Expr** argv; + } args; +} + +%token AND OR SUBSTR SUPERSTR EQ NE IF THEN ELSE ENDIF +%token STRING BAD +%type expr +%type arglist + +%parse-param {Expr** root} +%parse-param {int* error_count} +%error-verbose + +/* declarations in increasing order of precedence */ +%left ';' +%left ',' +%left OR +%left AND +%left EQ NE +%left '+' +%right '!' + +%% + +input: expr { *root = $1; } +; + +expr: STRING { + $$ = reinterpret_cast(malloc(sizeof(Expr))); + $$->fn = Literal; + $$->name = $1; + $$->argc = 0; + $$->argv = NULL; + $$->start = @$.start; + $$->end = @$.end; +} +| '(' expr ')' { $$ = $2; $$->start=@$.start; $$->end=@$.end; } +| expr ';' { $$ = $1; $$->start=@1.start; $$->end=@1.end; } +| expr ';' expr { $$ = Build(SequenceFn, @$, 2, $1, $3); } +| error ';' expr { $$ = $3; $$->start=@$.start; $$->end=@$.end; } +| expr '+' expr { $$ = Build(ConcatFn, @$, 2, $1, $3); } +| expr EQ expr { $$ = Build(EqualityFn, @$, 2, $1, $3); } +| expr NE expr { $$ = Build(InequalityFn, @$, 2, $1, $3); } +| expr AND expr { $$ = Build(LogicalAndFn, @$, 2, $1, $3); } +| expr OR expr { $$ = Build(LogicalOrFn, @$, 2, $1, $3); } +| '!' expr { $$ = Build(LogicalNotFn, @$, 1, $2); } +| IF expr THEN expr ENDIF { $$ = Build(IfElseFn, @$, 2, $2, $4); } +| IF expr THEN expr ELSE expr ENDIF { $$ = Build(IfElseFn, @$, 3, $2, $4, $6); } +| STRING '(' arglist ')' { + $$ = reinterpret_cast(malloc(sizeof(Expr))); + $$->fn = FindFunction($1); + if ($$->fn == NULL) { + char buffer[256]; + snprintf(buffer, sizeof(buffer), "unknown function \"%s\"", $1); + yyerror(root, error_count, buffer); + YYERROR; + } + $$->name = $1; + $$->argc = $3.argc; + $$->argv = $3.argv; + $$->start = @$.start; + $$->end = @$.end; +} +; + +arglist: /* empty */ { + $$.argc = 0; + $$.argv = NULL; +} +| expr { + $$.argc = 1; + $$.argv = reinterpret_cast(malloc(sizeof(Expr*))); + $$.argv[0] = $1; +} +| arglist ',' expr { + $$.argc = $1.argc + 1; + $$.argv = reinterpret_cast(realloc($$.argv, $$.argc * sizeof(Expr*))); + $$.argv[$$.argc-1] = $3; +} +; + +%% + +void yyerror(Expr** root, int* error_count, const char* s) { + if (strlen(s) == 0) { + s = "syntax error"; + } + printf("line %d col %d: %s\n", gLine, gColumn, s); + ++*error_count; +} + +int parse_string(const char* str, Expr** root, int* error_count) { + yy_switch_to_buffer(yy_scan_string(str)); + return yyparse(root, error_count); +} -- cgit v1.2.3