branch: externals/a68-mode commit bd8268af324fbd36f3249f82469fc36975f01bf1 Author: Jose E. Marchesi <jose.march...@oracle.com> Commit: Jose E. Marchesi <jose.march...@oracle.com>
Improve choice-clauses in SMIE grammar --- a68-mode.el | 75 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/a68-mode.el b/a68-mode.el index d3fa94ca33..e8b6e73b54 100644 --- a/a68-mode.el +++ b/a68-mode.el @@ -344,9 +344,12 @@ with the equivalent upcased form." (fields (fields "," fields) (ids)) (args ("(" fargs ")")) + (spec ("(" fargs "):") + (exp)) (fargs (fargs "," fargs) (exp)) - (conformity-cases) + (specs (specs "," specs) + (spec)) (exp (ids) (exp "of" exp) (exp "[" exp "]") @@ -365,6 +368,54 @@ with the equivalent upcased form." (proc-decl (proc-decl "," proc-decl) ("op" ids "=" args ids ":" exp) ("proc" ids "=" ids ":" exp)) + ;; Enquiry clause: + ;; enquiry clause : + ;; series. + (enquiry-clause (insts)) + ;; Choice clauses + ;; choice clause : + ;; choice start, chooser choice clause, choice finish. + ;; chooser choice clause : + ;; enquiry clause, alternate choice clause. + ;; enquiry clause : + ;; series. + ;; alternate choice clause : + ;; in choice clause, (out choice clause). + ;; in choice clause : + ;; choice in, in part of choice. + ;; in part of choice : + ;; serial clause ; case part list proper ; united case part. + ;; case part list proper : + ;; case part list, and also token, case part. + ;; case part list : + ;; (case part list, and also token), case part. + ;; case part : + ;; unit ; united case part. + ;; united case part : + ;; specification, unit. + ;; specification : + ;; single declaration brief pack, specification token. + ;; single declaration brief pack : + ;; brief begin token, single declaration, brief end token. + ;; single declaration : + ;; declarer, (dectag insert, identifier). + ;; out choice clause : + ;; choice out, serial clause ; + ;; choice again, chooser choice clause. + (choice-clause ("if" enquiry-clause "then" insts "fi") + ("if" enquiry-clause "then" insts "else" insts "fi") + ("if" enquiry-clause "then" insts + "elif" enquiry-clause "then" insts "fi") + ("(" enquiry-clause "|" insts ")") + ("(" enquiry-clause "|" insts "|" insts ")") + ("(" enquiry-clause "|" insts + "|:" enquiry-clause "|" insts ")") + ("case" enquiry-clause "in" specs "esac") + ("case" enquiry-clause "in" specs "out" insts "esac") + ("case" enquiry-clause "in" specs "ouse" insts "esac") + ("(" enquiry-clause "|" specs ")") + ("(" enquiry-clause "|" specs "|" insts ")") + ("(" enquiry-clause "|" specs "|:" insts ")")) ;; Loop clauses. ;; loop clause : ;; loop insert, for part, (from part), (by part), (to part), repeating part. @@ -400,20 +451,10 @@ with the equivalent upcased form." ("-do-" exp "od")) (insts (insts ";" insts) (id ":=" exp) - ("if" exp "then" insts "fi") - ("if" exp "then" insts "else" insts "fi") - ("if" exp "then" insts - "elif" exp "then" insts "else" insts "fi") - ("if" exp "then" insts - "elif" exp "then" insts - "elif" exp "then" insts "else" insts "fi") - ;; TODO OUSE for both case and conformity case - ("case" exp "in" fargs "esac") - ("case" exp "in" conformity-cases "esac") - ("case" exp "in" fargs "out" exp "esac") (op-decl) (type-decl) (proc-decl) + (choice-clause) (loop-clause))) "Algol 68 BNF operator precedence grammar to use with SMIE") @@ -432,7 +473,7 @@ with the equivalent upcased form." (smie-bnf->prec2 a68--bnf-grammar '((assoc "of" "[") (assoc ";") - (assoc "|" "|:") +; (assoc "|" "|:") (assoc ",")) '((assoc "=" "/" ":=" ":=:" ":/=:" "+" "-" "*" "/"))))) @@ -440,7 +481,7 @@ with the equivalent upcased form." ;;;; SMIE lexer (defvar a68--keywords-regexp - (regexp-opt '("+" "*" ";" ">" "<" ":=" "=" "," ":" "~"))) + (regexp-opt '("|:" "(" ")" "+" "*" ";" ">" "<" ":=" "=" "," ":" "~"))) (defun a68-at-strong-void-enclosed-clause () "Return whether the point is at the beginning of a VOID enclosed clause." @@ -509,6 +550,9 @@ with the equivalent upcased form." (defun a68--smie-forward-token () (forward-comment (point-max)) (cond + ((looking-at "):") + (goto-char (+ (point) 2)) + "):") ;; The symbols "by", "from", "to", "while" and "do" mark the start ;; of a loop-clause if they are the first symbol of an ;; enclosed-clause, and is thus preceded by a symbol which may @@ -589,6 +633,9 @@ with the equivalent upcased form." (defun a68--smie-backward-token () (forward-comment (- (point))) (cond + ((looking-back "):") + (goto-char (- (point) 2)) + "):") ;; See comments in a68--smie-forward-token for an explanation of ;; the handling of loop insertions -from- -to- -by- -while-. ((looking-back "\\<from\\>")