kconfig: fix ambiguous grammar in terms of new lines
[carl9170fw.git] / config / zconf.l
index 3c3f52a7537e1f51841bb92c82cbdfe8239c8607..bbbef0c9072c7ff185a6146c83a60b3bff5e489f 100644 (file)
@@ -1,12 +1,13 @@
 %option nostdinit noyywrap never-interactive full ecs
 %option 8bit nodefault yylineno
-%x COMMAND HELP STRING PARAM
+%x COMMAND HELP STRING PARAM ASSIGN_VAL
 %{
 /*
  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
  * Released under the terms of the GNU GPL v2.0.
  */
 
+#include <assert.h>
 #include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -15,6 +16,8 @@
 
 #include "lkc.h"
 
+#define YY_DECL                static int yylex1(void)
+
 #define START_STRSIZE  16
 
 static struct {
@@ -22,6 +25,7 @@ static struct {
        int lineno;
 } current_pos;
 
+static int prev_token = T_EOL;
 static char *text;
 static int text_size, text_asize;
 
@@ -72,7 +76,7 @@ static void warn_ignored_character(char chr)
 {
        fprintf(stderr,
                "%s:%d:warning: ignoring unsupported character '%c'\n",
-               zconf_curname(), zconf_lineno(), chr);
+               current_file->name, yylineno, chr);
 }
 %}
 
@@ -87,12 +91,6 @@ n    [A-Za-z0-9_-]
        return T_EOL;
 }
 [ \t]*#.*
-
-
-[ \t]+ {
-       BEGIN(COMMAND);
-}
-
 .      {
        unput(yytext[0]);
        BEGIN(COMMAND);
@@ -102,17 +100,28 @@ n [A-Za-z0-9_-]
 <COMMAND>{
        {n}+    {
                const struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
-               BEGIN(PARAM);
                current_pos.file = current_file;
                current_pos.lineno = yylineno;
                if (id && id->flags & TF_COMMAND) {
+                       BEGIN(PARAM);
                        yylval.id = id;
                        return id->token;
                }
                alloc_string(yytext, yyleng);
                yylval.string = text;
-               return T_WORD;
+               return T_VARIABLE;
+       }
+       ({n}|$)+        {
+               /* this token includes at least one '$' */
+               yylval.string = expand_token(yytext, yyleng);
+               if (strlen(yylval.string))
+                       return T_VARIABLE;
+               free(yylval.string);
        }
+       "="     { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_RECURSIVE; return T_ASSIGN; }
+       ":="    { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_SIMPLE; return T_ASSIGN; }
+       "+="    { BEGIN(ASSIGN_VAL); yylval.flavor = VAR_APPEND; return T_ASSIGN; }
+       [[:blank:]]+
        .       warn_ignored_character(*yytext);
        \n      {
                BEGIN(INITIAL);
@@ -120,6 +129,16 @@ n  [A-Za-z0-9_-]
        }
 }
 
+<ASSIGN_VAL>{
+       [^[:blank:]\n]+.*       {
+               alloc_string(yytext, yyleng);
+               yylval.string = text;
+               return T_ASSIGN_VAL;
+       }
+       \n      { BEGIN(INITIAL); return T_EOL; }
+       .
+}
+
 <PARAM>{
        "&&"    return T_AND;
        "||"    return T_OR;
@@ -166,19 +185,9 @@ n  [A-Za-z0-9_-]
 
 <STRING>{
        "$".*   append_expanded_string(yytext);
-       [^$'"\\\n]+/\n  {
-               append_string(yytext, yyleng);
-               yylval.string = text;
-               return T_WORD_QUOTE;
-       }
        [^$'"\\\n]+     {
                append_string(yytext, yyleng);
        }
-       \\.?/\n {
-               append_string(yytext + 1, yyleng - 1);
-               yylval.string = text;
-               return T_WORD_QUOTE;
-       }
        \\.?    {
                append_string(yytext + 1, yyleng - 1);
        }
@@ -194,11 +203,15 @@ n [A-Za-z0-9_-]
                fprintf(stderr,
                        "%s:%d:warning: multi-line strings not supported\n",
                        zconf_curname(), zconf_lineno());
+               unput('\n');
                BEGIN(INITIAL);
-               return T_EOL;
+               yylval.string = text;
+               return T_WORD_QUOTE;
        }
        <<EOF>> {
                BEGIN(INITIAL);
+               yylval.string = text;
+               return T_WORD_QUOTE;
        }
 }
 
@@ -258,6 +271,24 @@ n  [A-Za-z0-9_-]
 }
 
 %%
+
+/* second stage lexer */
+int yylex(void)
+{
+       int token;
+
+repeat:
+       token = yylex1();
+
+       /* Do not pass unneeded T_EOL to the parser. */
+       if ((prev_token == T_EOL || prev_token == T_HELPTEXT) && token == T_EOL)
+               goto repeat;
+
+       prev_token = token;
+
+       return token;
+}
+
 static char *expand_token(const char *in, size_t n)
 {
        char *out;