emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: asking for advice for changing the cfengine.el progmode to support C


From: Ted Zlatanov
Subject: Re: asking for advice for changing the cfengine.el progmode to support CFEngine 3.x
Date: Mon, 20 Jun 2011 15:42:01 -0500
User-agent: Gnus/5.110018 (No Gnus v0.18) Emacs/24.0.50 (gnu/linux)

On Fri, 17 Jun 2011 18:02:32 -0400 Stefan Monnier <address@hidden> wrote: 

>> 1) (body|bundle).+ sets the indentation to 0
SM> I'd recommend you try the new SMIE thingy (me? biased?).
SM> The syntax you show doesn't seem like a perfect fit, but neither does it
SM> seem obviously difficult to accomodate.

SM> Grep for smie-setup to see some example uses (2 uses in trunk right
SM> now.  There is another one in an earlier version of prolog.el, plus one
SM> in ProofGeneral's coq.el, and I have experimental ones for sh-script,
SM> SML, and Pascal, if you're interested).

SM> There is also documentation in the Elisp manual.

SMIE is very new so I am concerned that relying on it will block Emacs
users that haven't upgraded.  Can it be distributed with my library?

It's also fairly hard to specify an operator precedence grammar for
CFEngine using SMIE.  I tried it and ended up uncertain how to debug the
parse tree of the current buffer or where my grammar's error lay.  See
below.  Perhaps I'm just too accustomed to LALR parsers, but they seem
easier and less ambiguous.  It's likely I misunderstood the examples, in
any case.

Thanks
Ted

#+begin_src lisp
(defconst cfengine3-operator-table
  '((assoc ",")
    (right "=>")
    (left ":")
    (assoc "||") (assoc "&&") (assoc ".")
    (right "!")))

(defconst cfengine3-smie-bnf-table
  '((classname)
    (class_condition (class_condition "&&" class_condition)
                     (class_condition "||" class_condition)
                     (class_condition "." class_condition)
                     ("!" class_condition)
                     (classname))
    (promise)
    (section)
    (bundle)
    (bundle_type)
    (function_parameter)
    (bundle_parameters (bundle_parameters "," bundle_parameters)
                       (function_parameter))
    (bundle_name (bundle)
                 (bundle bundle_parameters))
    (bundle_line ("bundle" bundle_type bundle_name))
    (promises (promise ";" promise) (promise))
    (bundle_section (section ":" "\n" promises)
                    (class_condition "::" "\n" promises))
    (bundle_body (bundle_section) (bundle_section "\n" bundle_section))
    (bundle_block (bundle_line "{" bundle_body "}"))))

(defvar cfengine3-smie-grammar
  (smie-prec2->grammar
   (smie-merge-prec2s
    (smie-bnf->prec2 cfengine3-smie-bnf-table
                     '((assoc "\n" ";")))
    (smie-precs->prec2 cfengine3-operator-table))))

#+end_src




reply via email to

[Prev in Thread] Current Thread [Next in Thread]