;;; semantic/grammar-wy.el --- Generated parser support file -*- lexical-binding:t -*-
;; Copyright (C) 2002-2025 Free Software Foundation, Inc.
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see .
;;; Commentary:
;;
;; This file was generated from admin/grammars/grammar.wy.
;;; Code:
(require 'semantic/lex)
(require 'semantic/wisent)
;;; Prologue
;;
(defvar semantic-grammar-lex-c-char-re)
;; Current parsed nonterminal name.
(defvar semantic-grammar-wy--nterm nil)
;; Index of rule in a nonterminal clause.
(defvar semantic-grammar-wy--rindx nil)
;;; Declarations
;;
(eval-and-compile (defconst semantic-grammar-wy--expected-conflicts
nil
"The number of expected shift/reduce conflicts in this grammar."))
(defconst semantic-grammar-wy--keyword-table
(semantic-lex-make-keyword-table
'(("%default-prec" . DEFAULT-PREC)
("%no-default-prec" . NO-DEFAULT-PREC) ("%keyword" . KEYWORD)
("%languagemode" . LANGUAGEMODE) ("%left" . LEFT)
("%nonassoc" . NONASSOC) ("%package" . PACKAGE)
("%expectedconflicts" . EXPECTEDCONFLICTS) ("%provide" . PROVIDE)
("%prec" . PREC) ("%put" . PUT) ("%quotemode" . QUOTEMODE)
("%right" . RIGHT) ("%scopestart" . SCOPESTART) ("%start" . START)
("%token" . TOKEN) ("%type" . TYPE) ("%use-macros" . USE-MACROS))
'nil)
"Table of language keywords.")
(defconst semantic-grammar-wy--token-table
(semantic-lex-make-type-table
'(("punctuation" (GT . ">") (LT . "<") (OR . "|") (SEMI . ";")
(COLON . ":"))
("close-paren" (RBRACE . "}") (RPAREN . ")"))
("open-paren" (LBRACE . "{") (LPAREN . "("))
("block" (BRACE_BLOCK . "(LBRACE RBRACE)")
(PAREN_BLOCK . "(LPAREN RPAREN)"))
("code" (EPILOGUE . "%%...EOF") (PROLOGUE . "%{...%}"))
("sexp" (SEXP)) ("qlist" (PREFIXED_LIST)) ("char" (CHARACTER))
("symbol" (PERCENT_PERCENT . "\\`%%\\'") (SYMBOL))
("string" (STRING)))
'(("punctuation" :declared t) ("block" :declared t)
("sexp" matchdatatype sexp) ("sexp" syntax "\\=")
("sexp" :declared t) ("qlist" matchdatatype sexp)
("qlist" syntax "\\s'\\s-*(") ("qlist" :declared t)
("char" syntax semantic-grammar-lex-c-char-re) ("char" :declared t)
("symbol" syntax ":?\\(\\sw\\|\\s_\\)+") ("symbol" :declared t)
("string" :declared t) ("keyword" :declared t)))
"Table of lexical tokens.")
(defconst semantic-grammar-wy--parse-table
(wisent-compiled-grammar
((DEFAULT-PREC NO-DEFAULT-PREC KEYWORD LANGUAGEMODE LEFT NONASSOC
PACKAGE EXPECTEDCONFLICTS PROVIDE PREC PUT QUOTEMODE
RIGHT SCOPESTART START TOKEN TYPE USE-MACROS STRING
SYMBOL PERCENT_PERCENT CHARACTER PREFIXED_LIST SEXP
PROLOGUE EPILOGUE PAREN_BLOCK BRACE_BLOCK LPAREN
RPAREN LBRACE RBRACE COLON SEMI OR LT GT)
nil
(grammar ((prologue)) ((epilogue)) ((declaration)) ((nonterminal))
((PERCENT_PERCENT)))
(prologue
((PROLOGUE) (wisent-raw-tag (semantic-tag-new-code "prologue" nil))))
(epilogue
((EPILOGUE) (wisent-raw-tag (semantic-tag-new-code "epilogue" nil))))
(declaration ((decl) (eval $1 t)))
(decl ((default_prec_decl)) ((no_default_prec_decl))
((languagemode_decl)) ((package_decl))
((expectedconflicts_decl)) ((provide_decl))
((precedence_decl)) ((put_decl)) ((quotemode_decl))
((scopestart_decl)) ((start_decl)) ((keyword_decl))
((token_decl)) ((type_decl)) ((use_macros_decl)))
(default_prec_decl
((DEFAULT-PREC)
`(wisent-raw-tag
(semantic-tag "default-prec" 'assoc :value '("t")))))
(no_default_prec_decl
((NO-DEFAULT-PREC)
`(wisent-raw-tag
(semantic-tag "default-prec" 'assoc :value '("nil")))))
(languagemode_decl
((LANGUAGEMODE symbols)
`(wisent-raw-tag
(semantic-tag ',(car $2) 'languagemode :rest ',(cdr $2)))))
(package_decl
((PACKAGE SYMBOL)
`(wisent-raw-tag (semantic-tag-new-package ',$2 nil))))
(expectedconflicts_decl
((EXPECTEDCONFLICTS symbols)
`(wisent-raw-tag
(semantic-tag ',(car $2) 'expectedconflicts :rest ',(cdr $2)))))
(provide_decl
((PROVIDE SYMBOL) `(wisent-raw-tag (semantic-tag ',$2 'provide))))
(precedence_decl
((associativity token_type_opt items)
`(wisent-raw-tag (semantic-tag ',$1 'assoc :type ',$2 :value ',$3))))
(associativity ((LEFT) (progn "left")) ((RIGHT) (progn "right"))
((NONASSOC) (progn "nonassoc")))
(put_decl
((PUT put_name put_value)
`(wisent-raw-tag (semantic-tag ',$2 'put :value ',(list $3))))
((PUT put_name put_value_list)
`(wisent-raw-tag (semantic-tag ',$2 'put :value ',$3)))
((PUT put_name_list put_value)
`(wisent-raw-tag
(semantic-tag ',(car $2) 'put :rest ',(cdr $2) :value
',(list $3))))
((PUT put_name_list put_value_list)
`(wisent-raw-tag
(semantic-tag ',(car $2) 'put :rest ',(cdr $2) :value ',$3))))
(put_name_list
((BRACE_BLOCK)
(mapcar #'semantic-tag-name
(semantic-parse-region (car $region1) (cdr $region1)
'put_names 1))))
(put_names ((LBRACE) nil) ((RBRACE) nil)
((put_name) (wisent-raw-tag (semantic-tag $1 'put-name))))
(put_name ((SYMBOL)) ((token_type)))
(put_value_list
((BRACE_BLOCK)
(mapcar #'semantic-tag-code-detail
(semantic-parse-region (car $region1) (cdr $region1)
'put_values 1))))
(put_values ((LBRACE) nil) ((RBRACE) nil)
((put_value)
(wisent-raw-tag (semantic-tag-new-code "put-value" $1))))
(put_value ((SYMBOL any_value) (cons $1 $2)))
(scopestart_decl
((SCOPESTART SYMBOL)
`(wisent-raw-tag (semantic-tag ',$2 'scopestart))))
(quotemode_decl
((QUOTEMODE SYMBOL)
`(wisent-raw-tag (semantic-tag ',$2 'quotemode))))
(start_decl
((START symbols)
`(wisent-raw-tag (semantic-tag ',(car $2) 'start :rest ',(cdr $2)))))
(keyword_decl
((KEYWORD SYMBOL string_value)
`(wisent-raw-tag (semantic-tag ',$2 'keyword :value ',$3))))
(token_decl
((TOKEN token_type_opt SYMBOL string_value)
`(wisent-raw-tag
(semantic-tag ',$3 ',(if $2 'token 'keyword) :type ',$2 :value
',$4)))
((TOKEN token_type_opt symbols)
`(wisent-raw-tag
(semantic-tag ',(car $3) 'token :type ',$2 :rest ',(cdr $3)))))
(token_type_opt (nil) ((token_type)))
(token_type ((LT SYMBOL GT) (progn $2)))
(type_decl
((TYPE token_type plist_opt)
`(wisent-raw-tag (semantic-tag ',$2 'type :value ',$3))))
(plist_opt (nil) ((plist)))
(plist ((plist put_value) (append (list $2) $1))
((put_value) (list $1)))
(use_name_list
((BRACE_BLOCK)
(mapcar #'semantic-tag-name
(semantic-parse-region (car $region1) (cdr $region1)
'use_names 1))))
(use_names ((LBRACE) nil) ((RBRACE) nil)
((SYMBOL) (wisent-raw-tag (semantic-tag $1 'use-name))))
(use_macros_decl
((USE-MACROS SYMBOL use_name_list)
`(wisent-raw-tag
(semantic-tag "macro" 'macro :type ',$2 :value ',$3))))
(string_value ((STRING) (read $1)))
(any_value ((SYMBOL)) ((STRING)) ((PAREN_BLOCK)) ((PREFIXED_LIST))
((SEXP)))
(symbols ((lifo_symbols) (nreverse $1)))
(lifo_symbols ((lifo_symbols SYMBOL) (cons $2 $1))
((SYMBOL) (list $1)))
(nonterminal
((SYMBOL
(setq semantic-grammar-wy--nterm $1 semantic-grammar-wy--rindx 0)
COLON rules SEMI)
(wisent-raw-tag (semantic-tag $1 'nonterminal :children $4))))
(rules ((lifo_rules) (apply #'nconc (nreverse $1))))
(lifo_rules ((lifo_rules OR rule) (cons $3 $1)) ((rule) (list $1)))
(rule
((rhs)
(let*
((nterm semantic-grammar-wy--nterm)
(rindx semantic-grammar-wy--rindx) (rhs $1) comps prec action
elt)
(setq semantic-grammar-wy--rindx (1+ semantic-grammar-wy--rindx))
(while rhs
(setq elt (car rhs) rhs (cdr rhs))
(cond
((vectorp elt)
(if prec
(error "Duplicate %%prec in `%s:%d' rule" nterm rindx))
(setq prec (aref elt 0)))
((consp elt)
(if (or action comps)
(setq comps (cons elt comps) semantic-grammar-wy--rindx
(1+ semantic-grammar-wy--rindx))
(setq action (car elt))))
(t (setq comps (cons elt comps)))))
(wisent-cook-tag
(wisent-raw-tag
(semantic-tag (format "%s:%d" nterm rindx) 'rule :type
(if comps "group" "empty") :value comps :prec
prec :expr action))))))
(rhs (nil) ((rhs item) (cons $2 $1))
((rhs action) (cons (list $2) $1))
((rhs PREC item) (cons (vector $3) $1)))
(action ((PAREN_BLOCK)) ((PREFIXED_LIST))
((BRACE_BLOCK)
(format "(progn\n%s)"
(let ((s $1))
(if (string-match "^{[
\n ]*" s)
(setq s (substring s (match-end 0))))
(if (string-match "[
\n ]*}$" s)
(setq s (substring s 0 (match-beginning 0))))
s))))
(items ((lifo_items) (nreverse $1)))
(lifo_items ((lifo_items item) (cons $2 $1)) ((item) (list $1)))
(item ((SYMBOL)) ((CHARACTER))))
(grammar prologue epilogue declaration nonterminal rule put_names
put_values use_names))
"Parser table.")
(defun semantic-grammar-wy--install-parser ()
"Setup the Semantic Parser."
(semantic-install-function-overrides
'((semantic-parse-stream . wisent-parse-stream)))
(setq semantic-parser-name "LALR"
semantic--parse-table semantic-grammar-wy--parse-table
semantic-debug-parser-source "grammar.wy"
semantic-flex-keywords-obarray semantic-grammar-wy--keyword-table
semantic-lex-types-obarray semantic-grammar-wy--token-table)
;; Collect unmatched syntax lexical tokens
(add-hook 'wisent-discarding-token-functions
#'wisent-collect-unmatched-syntax nil t))
;;; Analyzers
;;
(define-lex-keyword-type-analyzer semantic-grammar-wy---keyword-analyzer
"keyword analyzer for tokens."
"\\(\\sw\\|\\s_\\)+"
)
(define-lex-regex-type-analyzer semantic-grammar-wy---regexp-analyzer
"regexp analyzer for tokens."
semantic-grammar-lex-c-char-re
nil
'CHARACTER
)
(define-lex-sexp-type-analyzer semantic-grammar-wy---sexp-analyzer
"sexp analyzer for tokens."
"\\s\""
'STRING
)
(define-lex-block-type-analyzer semantic-grammar-wy---block-analyzer
"block analyzer for tokens."
"\\s(\\|\\s)"
'((("(" LPAREN PAREN_BLOCK) ("{" LBRACE BRACE_BLOCK)) (")" RPAREN)
("}" RBRACE))
)
(define-lex-string-type-analyzer semantic-grammar-wy---string-analyzer
"string analyzer for tokens."
"\\(\\s.\\|\\s$\\|\\s'\\)+"
'((GT . ">") (LT . "<") (OR . "|") (SEMI . ";") (COLON . ":"))
'punctuation
)
(define-lex-regex-type-analyzer semantic-grammar-wy---regexp-analyzer
"regexp analyzer for tokens."
":?\\(\\sw\\|\\s_\\)+"
'((PERCENT_PERCENT . "\\`%%\\'"))
'SYMBOL
)
(define-lex-sexp-type-analyzer semantic-grammar-wy---sexp-analyzer
"sexp analyzer for tokens."
"\\s'\\s-*("
'PREFIXED_LIST
)
(define-lex-sexp-type-analyzer semantic-grammar-wy---sexp-analyzer
"sexp analyzer for tokens."
"\\="
'SEXP
)
;;; Epilogue
;;
(provide 'semantic/grammar-wy)
;; Local Variables:
;; version-control: never
;; no-update-autoloads: t
;; End:
;;; semantic/grammar-wy.el ends here