From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.help Subject: Re: SMIE: if-elseif-else constructs Date: Tue, 06 Oct 2020 10:04:10 -0400 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="17038"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) To: help-gnu-emacs@gnu.org Cancel-Lock: sha1:uSeSIW/XRhP8WQl1xkbRsRsSmM4= Original-X-From: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Tue Oct 06 16:06:26 2020 Return-path: Envelope-to: geh-help-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kPnbm-0004Ds-4U for geh-help-gnu-emacs@m.gmane-mx.org; Tue, 06 Oct 2020 16:06:26 +0200 Original-Received: from localhost ([::1]:38190 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kPnbl-00034f-5D for geh-help-gnu-emacs@m.gmane-mx.org; Tue, 06 Oct 2020 10:06:25 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:49928) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kPnZo-0002Ds-Vn for help-gnu-emacs@gnu.org; Tue, 06 Oct 2020 10:04:26 -0400 Original-Received: from static.214.254.202.116.clients.your-server.de ([116.202.254.214]:35480 helo=ciao.gmane.io) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kPnZl-0002Bd-0v for help-gnu-emacs@gnu.org; Tue, 06 Oct 2020 10:04:24 -0400 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1kPnZg-00017x-JI for help-gnu-emacs@gnu.org; Tue, 06 Oct 2020 16:04:16 +0200 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=geh-help-gnu-emacs@m.gmane-mx.org; helo=ciao.gmane.io X-detected-operating-system: by eggs.gnu.org: First seen = 2020/10/06 10:04:18 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: help-gnu-emacs@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Users list for the GNU Emacs text editor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: help-gnu-emacs-bounces+geh-help-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "help-gnu-emacs" Xref: news.gmane.io gmane.emacs.help:124333 Archived-At: > I think I've found a better way. I revised the grammar and adjusted > the indentation rules. > The following seems to work. It looks OK, now (tho I think it implies that "elsif" is nested within the right hand side of "then", which I think is wrong in the sense that it doesn't reflect the natural shape of the abstract syntax tree). It seems similar to the approach I've used in such cases, except I would have used something like: (inst ("if" if-body "end")) (if-body (exp "then" insts) (if-body "elseif" if-body) (if-body "else" exp)) with an ((assoc "elseif") (nonassoc "else")). I believe this better reflects the intended abstract syntax tree, so it should behave a bit better w.r.t indentation and navigation. BTW, another way to define the grammar can be: [...] (inst ("if" exp "then" insts "end") ("if" exp "then" insts "else" insts "end") ("if" exp "then" insts "elsif" exp "then" insts "else" insts "end") [...] You don't need to list all the (infinite number of) combinations, the above is sufficient for SMIE to figure out the needed relative constraints between the precedences of the keywords. But IIRC this approach tends to behave less robustly in cases of syntax error (by which I mean either when the source code is incorrect or when SMIE parses incorrectly because its grammar or lexer isn't good enough). Stefan