From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Stefan Monnier Newsgroups: gmane.emacs.devel Subject: Re: SMIE Date: Wed, 09 Jul 2014 23:02:15 -0400 Message-ID: References: NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Trace: ger.gmane.org 1404961361 6810 80.91.229.3 (10 Jul 2014 03:02:41 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 10 Jul 2014 03:02:41 +0000 (UTC) Cc: emacs-devel@gnu.org To: Matt DeBoard Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Jul 10 05:02:32 2014 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1X54cy-0001wb-Ji for ged-emacs-devel@m.gmane.org; Thu, 10 Jul 2014 05:02:32 +0200 Original-Received: from localhost ([::1]:35413 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X54cx-0008Bf-Tb for ged-emacs-devel@m.gmane.org; Wed, 09 Jul 2014 23:02:32 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:48136) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X54cp-00089Q-OB for emacs-devel@gnu.org; Wed, 09 Jul 2014 23:02:29 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X54cj-0000Vh-PY for emacs-devel@gnu.org; Wed, 09 Jul 2014 23:02:23 -0400 Original-Received: from ironport2-out.teksavvy.com ([206.248.154.181]:59043) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X54cj-0000VF-IS for emacs-devel@gnu.org; Wed, 09 Jul 2014 23:02:17 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArgGAIDvNVNLd+D9/2dsb2JhbABZgwY7gw9Sv2uBFxd0giUBAQEBAgEjMyMFCwsaAhgOAgIUGA0kiAQIDa8Oon4TBIEpjG8RAR0zB4JvgUkElB6Ue4Fqg0whgTU X-IPAS-Result: ArgGAIDvNVNLd+D9/2dsb2JhbABZgwY7gw9Sv2uBFxd0giUBAQEBAgEjMyMFCwsaAhgOAgIUGA0kiAQIDa8Oon4TBIEpjG8RAR0zB4JvgUkElB6Ue4Fqg0whgTU X-IronPort-AV: E=Sophos;i="4.97,753,1389762000"; d="scan'208";a="77034710" Original-Received: from 75-119-224-253.dsl.teksavvy.com (HELO pastel.home) ([75.119.224.253]) by ironport2-out.teksavvy.com with ESMTP/TLS/ADH-AES256-SHA; 09 Jul 2014 23:02:15 -0400 Original-Received: by pastel.home (Postfix, from userid 20848) id A202D60A86; Wed, 9 Jul 2014 23:02:15 -0400 (EDT) In-Reply-To: (Matt DeBoard's message of "Wed, 9 Jul 2014 20:26:19 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4.50 (gnu/linux) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 206.248.154.181 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:172919 Archived-At: > Hi there. As the subject line says I=E2=80=99m writing for help with SMIE. Cool! > I am currently working on elixir-mode > , having (apparently) taking > over the mode as the latest in a line of contributors. I'd love to include this in GNU ELPA. Interested? > Specifically I=E2=80=99m having trouble understanding the mental model fo= r how > tokenisation & indentation works. For example, in this > issue, indentation > errors seem to crop up only after separating lines of code with blank > lines. > I have spent, seriously, hundreds of hours trying to sort out what=E2=80= =99s > happening here and I am at my wits=E2=80=99 end. IIUC, Elixir syntax does not treat all whitespace as "irrelevant", contrary to the default tokenizer of SMIE. > Does this issue ring any bells with issues you=E2=80=99ve dealt with in > the past? Yes, indeed. Octave and sh are two other languages that use SMIE and where some whitespace is syntactically significant. What you need to do is to change the tokenizer so that instead of skipping all whitespace, it turns the syntactically-significant whitespace into a token (you can name it any way you like; in the above languages, it turns out to be syntactically equivalent to a semi-colon, so we call it ";"). I know absolutely nothing about Elixir or its syntax, so I can't give you specific details, but you can look at octave.el and sh-script.el for examples. Feel free to email me back with more details if you need further help. > Final question, how is it determined if a token is a :list-intro token? Not sure I understand the question. The issue is for the indentation rules, when it sees two (or more) concatenated expressions (e.g. "exp1 exp2"), should it assume that exp2 is something like an argument to the exp1 function (and hence exp2 (and exp3, ...) should be indented like a function argument) or are all those "expressions" just a list, where the first is not more special than the second? This usually depends on the context. E.g. in a situation like fun x1 x2 x3 =3D> x2 is not an argument passed to the function x1; Instead x1, x2, and x3 are "siblings" and should be indented to the same level. So to decide how to indent x2 and x3 w.r.t x1, SMIE calls the smie-rule-function with (:list-intro . "fun") so smie-rule-function can tell it that "fun" introduces a *list* of "things" rather than being followed by a "normal expression". Does that make more sense? > I have read the SMIE manual ten times, at least, but I=E2=80=99m really > struggling. I would truly appreciate your help. I'm not very good at writing manuals, sorry. But I promise to do my best to help you get SMIE working well. In return, I would appreciate if you could help me improve the doc by giving, if not actual patches, at least suggestions of how to rewrite the doc, or what to add to it (usually, you can only make such suggestions after you finally understand what's going on, and at the same time it's important/necessary/useful to try and remember what it was that you didn't understand). Stefan