[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] poke-mode.el: support more expressions and simple type specifier
From: |
Jose E. Marchesi |
Subject: |
[PATCH] poke-mode.el: support more expressions and simple type specifiers |
Date: |
Wed, 16 Sep 2020 17:40:13 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) |
Hi Aurelien.
This expands the support for expressions in the smie grammar, and also
adds simple type specifiers. Note how the ">-constr" and "[-constr"
tokens are not yet generated by the lexer.
WDYT?
2020-09-16 Jose E. Marchesi <jemarch@gnu.org>
* etc/poke-mode.el (poke-smie-grammar): Add support for more
expressions.
(poke--smie-forward-token): Handle some tokens with common
prefixes.
---
ChangeLog | 7 ++++
etc/poke-mode.el | 85 +++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 88 insertions(+), 4 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 84790756..8aa0f45c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2020-09-16 Jose E. Marchesi <jemarch@gnu.org>
+
+ * etc/poke-mode.el (poke-smie-grammar): Add support for more
+ expressions.
+ (poke--smie-forward-token): Handle some tokens with common
+ prefixes.
+
2020-09-15 Aurélien Aptel <aaptel@suse.com>
* etc/poke-mode.el: Add SMIE grammar and indent code.
diff --git a/etc/poke-mode.el b/etc/poke-mode.el
index 253ee8ef..59f3d1d9 100644
--- a/etc/poke-mode.el
+++ b/etc/poke-mode.el
@@ -197,8 +197,42 @@
(smie-prec2->grammar
(smie-bnf->prec2
'((id)
- (exp ("[" exps "]"))
+ (exp ("[" exps "]")
+ (exp "+" exp)
+ (exp "-" exp)
+ (exp "*" exp)
+ (exp "/" exp)
+ (exp "/^" exp)
+ (exp "**" exp)
+ (exp "%" exp)
+ (exp "<<." exp)
+ (exp ".>>" exp)
+ (exp "==" exp)
+ (exp "!=" exp)
+ (exp "<" exp)
+ (exp ">" exp)
+ (exp "<=" exp)
+ (exp ">=" exp)
+ (exp "|" exp)
+ (exp "&" exp)
+ (exp "&&" exp)
+ (exp "||" exp)
+ (exp "in" exp)
+ (exp "as" exp)
+ (exp "isa" exp)
+ (exp ":::" exp)
+ (simple-type-specifier "@" exp)
+ (id "{" exps "}"))
(exps (exps "," exps) (exp))
+ (simple-type-specifier
+ (id)
+ ("any")
+ ("void")
+ ("string")
+ ("int<" integer ">-constr")
+ ("uint<" integer ">-constr")
+ ("offset<" simple-type-specifier "," id ">-constr")
+ (simple-type-specifier "[-constr" exp "]"))
(definition
(id "=" inst)
(id "=" id ":" inst))
@@ -212,12 +246,55 @@
("struct" id)
("union" id)
))
- '((assoc ";") (assoc ",")))))
+ '((assoc ";") (assoc ",")
+ (assoc "+") (assoc "-") (assoc "*") (assoc "/")
+ (assoc "/^") (assoc "**") (assoc "%")
+ (assoc ".>>") (assoc "<<.") (assoc "==") (assoc "!=")
+ (assoc "<") (assoc ">") (assoc "<=") (assoc ">=")
+ (assoc "|") (assoc "&") (assoc "&&") (assoc "||")
+ (assoc "in") (assoc "as") (assoc "isa")
+ (assoc ":::") (assoc "@")))))
(defun poke--smie-forward-token ()
;; FIXME:
;; Don't merge ":" or ";" with some preceding punctuation such as ">".
- (smie-default-forward-token))
+ (let ((case-fold-search nil)
+ (token (smie-default-forward-token)))
+ (cond
+ ;; Detect <<.
+ ((and (equal token ":") (looking-at "<\\."))
+ (forward-char 2)
+ "<<.")
+ ;; Detect **
+ ((and (equal token "*") (looking-at "\\*"))
+ (forward-char 2)
+ "**")
+ ;; Detect ==
+ ((and (equal token "=") (looking-at "="))
+ (forward-char 2)
+ "==")
+ ;; Detect <=
+ ((and (equal token "<") (looking-at "="))
+ (forward-char 2)
+ "<=")
+ ;; Detect >=
+ ((and (equal token ">") (looking-at "="))
+ (forward-char 2)
+ ">=")
+ ;; Detect &&
+ ((and (equal token "&") (looking-at "&"))
+ (forward-char 2)
+ "&&")
+ ;; Detect ||
+ ((and (equal token "|") (looking-at "|"))
+ (forward-char 2)
+ "||")
+ ;; Detect :::
+ ((and (equal token ":") (looking-at "::"))
+ (forward-char 3)
+ ":::")
+ (t
+ token))))
(defun poke--smie-backward-token ()
(forward-comment (- (point)))
@@ -249,7 +326,7 @@
(smie-setup poke-smie-grammar #'poke-smie-rules
:forward-token #'poke--smie-forward-token
:backward-token #'poke--smie-backward-token)
-
+
;; font-lock
(setq-local font-lock-defaults
'(poke-font-lock-keywords
--
2.25.0.2.g232378479e
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [PATCH] poke-mode.el: support more expressions and simple type specifiers,
Jose E. Marchesi <=