Commit Diff


commit - 92d1f34ce412ff453b3533f9d12786d24e16a9c5
commit + 1e3d47620a6c03ad0a992aae4ae2be06b44306c3
blob - 4bb45f624228ab0200aab45ca8574e1d46c9c2ed
blob + e829b1bc12b5612d28b4486647e20125adee6001
--- a68-mode.el
+++ a68-mode.el
@@ -109,46 +109,60 @@
 (defvar a68--smie-grammar
   (smie-prec2->grammar
    (smie-bnf->prec2 '((id)
-                      (expr ("-" expr)
-                            (expr "+" expr)
-                            (expr "*" expr)
-                            (expr "/" expr)
-                            (expr "=" expr)
-                            (expr "/=" expr)
-                            (expr ":=" expr)
-                            (expr ":=:" expr)
-                            (expr ":/=:" expr)
-                            ("BEGIN" exprs "END")
-                            ("(" exprs ")")
-                            ;; why all the repetitions?  copied from
-                            ;; sh-script.el
-                            ("IF" exprs "THEN" exprs "FI")
-                            ("IF" exprs "THEN" exprs "ELSE" exprs "FI")
-                            ("IF" exprs "THEN" exprs
-                             "ELIF" exprs "THEN" exprs "FI")
-                            ("IF" exprs "THEN" exprs
-                             "ELIF" exprs "THEN" exprs
-                             "ELSE" exprs "FI")
-                            ("IF" exprs "THEN" exprs
-                             "ELIF" exprs "THEN" exprs
-                             "ELIF" exprs "THEN" exprs
-                             "ELSE" exprs "FI")
-                            ("CASE" exprs "IN" exprs "ESAC")
-                            ("CASE" exprs "IN" exprs "OUT" exprs "ESAC"))
-                      (exprs (exprs "," exprs)
-                             (exprs ";" exprs)
-                             (exprs ":" exprs)
-                             (expr))
-                      (loop ("FOR" exprs "FROM" exprs "TO" exprs
-                             "BY" exprs "DO" exprs "OD")
-                            ("FOR" exprs "FROM" exprs "TO" exprs
-                             "DO" exprs "OD")
-                            ("FOR" exprs "BY" exprs "TO" exprs
-                             "DO" exprs "OD")
-                            ;; ("TO" exprs "DO" exprs "OD")
-                            ("WHILE" exprs "DO" exprs "OD")))
-                    '((assoc ";" "," ":"))
-                    '((assoc "=" "/=" ":=" ":=:" ":/=:"
+                      (ids (id "-anchor-" id))
+                      (fields (fields "," fields)
+                              (ids))
+                      (args ("(" fargs ")"))
+                      (fargs (fargs "," fargs)
+                             (exp))
+                      (exp (ids)
+                           (exp "OF" exp)
+                           (exp "[" exp "]")
+                           ("(" exp ")")
+                           ("BEGIN" exp "END"))
+                      (type-decl ("MODE" type-decl*))
+                      (type-decl* (type-decl* "," type-decl*)
+                                  (id "=" type-decl**))
+                      (type-decl** ("STRUCT" args)
+                                   ("UNION" args)
+                                   ("PROC" args "-archor-" ids))
+                      (op-decl (op-decl "," op-decl)
+                               ("OP" ids "=" args ids ":" exp))
+                      (proc-decl (proc-decl "," proc-decl)
+                                 ("OP" ids "=" args ids ":" exp)
+                                 ("PROC" ids "=" ids ":" exp))
+                      ;; TODO: this don't cover all the loop
+                      ;; possibilities.
+                      (loop ("FOR" exp "FROM" exp "TO" exp "BY" exp
+                             "DO" exp "OD")
+                            ("FOR" exp "FROM" exp "TO" exp
+                             "DO" exp "OD")
+                            ("FOR" exp "BY" exp "TO" exp
+                             "DO" exp "OD")
+                            ("-to-" "TO" exp "DO" exp "OD")
+                            ("WHILE" exp "DO" exp "OD"))
+                      (insts (insts ";" insts)
+                             (id ":=" exp)
+                             ("IF" exp "THEN" insts "FI")
+                             ("IF" exp "THEN" insts "ELSE" insts "FI")
+                             ("IF" exp "THEN" insts
+                              "ELSIF" exp "THEN" insts "ELSE" insts "FI")
+                             ("IF" exp "THEN" insts
+                              "ELSIF" exp "THEN" insts
+                              "ELSIF" 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)
+                             (loop)))
+                    '((assoc "OF" "[")
+                      (assoc ";")
+                      (assoc "|" "|:")
+                      (assoc ","))
+                    '((assoc "=" "/" ":=" ":=:" ":/=:"
                              "+" "-" "*" "/")))))
 
 (defun a68--smie-rules (kind token)