From patchwork Tue Dec 11 11:00:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 153434 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp476102ljp; Tue, 11 Dec 2018 03:03:05 -0800 (PST) X-Google-Smtp-Source: AFSGD/Wf2yGXEXo5LziNmKDAdgfGAOR4F4FmHVH+XS6CgfI+53EPpgbfkgguEuPYbPVrecOoN4EM X-Received: by 2002:a62:8e19:: with SMTP id k25mr15863779pfe.185.1544526185773; Tue, 11 Dec 2018 03:03:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544526185; cv=none; d=google.com; s=arc-20160816; b=E8t3XMfHn0b2Du/GQfcBR74QgRFM/Q5P/s27B4sf5VUyl6UemV9yQlxKRol57rTxo3 YmluGXOEs3PcioZRdo2gUgEDbZqwclye26ckVkpHnTXWSiKY+Z6u644Lp6N22er2h7Se eZ02hngbi9QguBVUtJPE9aai7/kuhUhfmTttFFexFxuj22RkJwwhpd/VeI9blJwx+HVI Naba7q2gYx2dt4PxyQWFk3VuGnka8dIhPpgsvsxvx7WdsobreKOuR3I9Pm3F8p1512hB nGu1uSPBsTbK1Fct8RgvJ0pwygH0rLqQPc7CiZXZZEnar8gdc6TdPTqR//j6m6RbaB28 q9yQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:dkim-filter; bh=G/ycLbPhkj1QR+lVIupeFYkdZAVqycrRJHc5wDj08Ec=; b=bfB1Gvq/Yyy5VaOfmx/CK2BWOhxaeT17q+NVKIghb+tBYiTB4xcfyw8D+lodO8nkkW Imftz+I/xGxK/kaplsa/dEIE3kr8lHBvvVrcpFyvQwv6MWVrPVKjIFQIhf5TZ7XtQg4x qxSTeH9hb9uy3cI+TfX/M0ywcUCmL5pvieHnNVKiqTX93drkpconnQvYw0e3TV1JHGse XMPRF4qobOfy+d+3asequOMlPY3E4HWw+CzNZ34zb4rvg7b+tJnH1kbEbcHEsG7CtQDc sfuvvjNDBn46UzoYRt05l0R9jEGnSV57cwXe9ifoQf3BiUv87sq1IYBOOh9QFlDX/0M5 6YpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=Na+UKrL6; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w185si13403408pfw.122.2018.12.11.03.03.05; Tue, 11 Dec 2018 03:03:05 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=Na+UKrL6; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726455AbeLKLCp (ORCPT + 31 others); Tue, 11 Dec 2018 06:02:45 -0500 Received: from conuserg-11.nifty.com ([210.131.2.78]:36702 "EHLO conuserg-11.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726606AbeLKLBo (ORCPT ); Tue, 11 Dec 2018 06:01:44 -0500 Received: from pug.e01.socionext.com (p14092-ipngnfx01kyoto.kyoto.ocn.ne.jp [153.142.97.92]) (authenticated) by conuserg-11.nifty.com with ESMTP id wBBB1C5h017210; Tue, 11 Dec 2018 20:01:17 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-11.nifty.com wBBB1C5h017210 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1544526077; bh=G/ycLbPhkj1QR+lVIupeFYkdZAVqycrRJHc5wDj08Ec=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Na+UKrL6DVf5o+zTz2mscnsaOfrJg/RpbNiehbQPgf1+O9/dl0AO8EB0bnm84MXzi UoxIcRd2bkcrQAMoap9eh9FgE0MA2Y1GgndVnQ0+fqG1FG/mZv0NrfT2JN/3XhDuBa /HYby/XiCXzsI2EpEXncyyyVqlCRwPV6Y7w+HTXRtTdwwUTZ79Tzb57T+2oZW0b4gf 4gXaVcl1OAh1eZYaDXRKtJjJFdRgTcsVdRtmRBawetptn5kFNvkqPb5j65mRbCNmZJ bV++p3kPVJvf1bLFkTZBnYDCDS3uG2vOkbDPiEL76ZJqWI4FnHxYBEx1hIDDE4OLW9 6As1Z/EdpfQUA== X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Ulf Magnusson , linux-kernel@vger.kernel.org, Masahiro Yamada Subject: [PATCH 06/27] kconfig: fix ambiguous grammar in terms of new lines Date: Tue, 11 Dec 2018 20:00:49 +0900 Message-Id: <1544526070-16690-7-git-send-email-yamada.masahiro@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1544526070-16690-1-git-send-email-yamada.masahiro@socionext.com> References: <1544526070-16690-1-git-send-email-yamada.masahiro@socionext.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This commit decreases 8 shift/reduce conflicts. A certain amount of grammatical ambiguity comes from how to reduce excessive T_EOL tokens. Let's take a look at the example code below: 1 config A 2 bool "a" 3 4 depends on B 5 6 config B 7 def_bool y The line 3 is melt into "config_option_list", but the line 5 can be either a part of "config_option_list" or "common_stmt" by itself. Currently, the lexer converts '\n' to T_EOL verbatim. In Kconfig, a new line is critical as a statement terminator, but new lines in empty lines are not important since empty lines (or lines that contain only whitespaces/comments) are just no-op. If the lexer simply discards no-op lines, the parser will not be bothered by excessive T_EOL tokens. Of course, this means we are shifting the complexity from the parser to the lexer, but it is much easier than tackling on shift/reduce conflicts. I introduced the second stage lexer to tweak the lexer. Discard T_EOL if the previous token is T_EOL or T_HELPTEXT. Two T_EOL tokens in a row is meaningless. T_HELPTEXT is a special token that is reduced without T_EOL. Signed-off-by: Masahiro Yamada --- scripts/kconfig/zconf.l | 21 +++++++++++++++++++++ scripts/kconfig/zconf.y | 18 +++--------------- 2 files changed, 24 insertions(+), 15 deletions(-) -- 2.7.4 diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l index b7bc164..847ba42 100644 --- a/scripts/kconfig/zconf.l +++ b/scripts/kconfig/zconf.l @@ -16,6 +16,8 @@ #include "lkc.h" +#define YY_DECL static int yylex1(void) + #define START_STRSIZE 16 static struct { @@ -23,6 +25,7 @@ static struct { int lineno; } current_pos; +static int prev_token = T_EOL; static char *text; static int text_size, text_asize; @@ -268,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; diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index c28f1a8..02bfc62 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -31,7 +31,7 @@ struct symbol *symbol_hash[SYMBOL_HASHSIZE]; static struct menu *current_menu, *current_entry; %} -%expect 29 +%expect 21 %union { @@ -111,9 +111,7 @@ static struct menu *current_menu, *current_entry; %} %% -input: nl start | start; - -start: mainmenu_stmt stmt_list | stmt_list; +input: mainmenu_stmt stmt_list | stmt_list; /* mainmenu entry */ @@ -141,8 +139,7 @@ option_name: ; common_stmt: - T_EOL - | if_stmt + if_stmt | comment_stmt | config_stmt | menuconfig_stmt @@ -193,7 +190,6 @@ config_option_list: | config_option_list depends | config_option_list help | config_option_list option_error - | config_option_list T_EOL ; config_option: T_TYPE prompt_stmt_opt T_EOL @@ -293,7 +289,6 @@ choice_option_list: | choice_option_list choice_option | choice_option_list depends | choice_option_list help - | choice_option_list T_EOL | choice_option_list option_error ; @@ -443,7 +438,6 @@ help: help_start T_HELPTEXT depends_list: /* empty */ | depends_list depends - | depends_list T_EOL | depends_list option_error ; @@ -458,7 +452,6 @@ depends: T_DEPENDS T_ON expr T_EOL visibility_list: /* empty */ | visibility_list visible - | visibility_list T_EOL ; visible: T_VISIBLE if_expr T_EOL @@ -484,11 +477,6 @@ end: T_ENDMENU T_EOL { $$ = $1; } | T_ENDIF T_EOL { $$ = $1; } ; -nl: - T_EOL - | nl T_EOL -; - if_expr: /* empty */ { $$ = NULL; } | T_IF expr { $$ = $2; } ;