Next: Start nonterminals, Previous: Bison style, Up: Grammar styles [Contents][Index]
%start grammar ;; Reparse %start prologue epilogue declaration nonterminal rule … %% grammar: prologue | epilogue | declaration | nonterminal | PERCENT_PERCENT ; … nonterminal: SYMBOL COLON rules SEMI (TAG 1ドル 'nonterminal :children 3ドル) ; rules: lifo_rules (apply 'nconc (nreverse 1ドル)) ; lifo_rules: lifo_rules OR rule (cons 3ドル 1ドル) | rule (list 1ドル) ; rule: rhs (let* ((rhs 1ドル) name type comps prec action elt) … (EXPANDTAG (TAG name 'rule :type type :value comps :prec prec :expr action) )) ;
This example shows how iterative and Bison styles can be combined in the same grammar to obtain a good compromise between grammar complexity and an efficient parsing strategy in an interactive environment.
‘nonterminal’ is parsed using iterative style via the main
‘grammar’ rule. The semantic action uses the TAG macro to
produce a raw tag, automagically expanded by Semantic.
But ‘rules’ part is parsed in Bison style! Why?
Rule delimiters are the colon (:), that follows the nonterminal
name, and a final semicolon (;). Unfortunately these
delimiters are not open-paren/close-paren type, and the
Emacs syntactic analyzer can’t easily isolate data between them to
produce a ‘RULES_PART’ parenthesis-block-like lexical token.
Consequently it is not possible to use EXPANDFULL to iterate in
‘RULES_PART’, like this:
nonterminal: SYMBOL COLON rules SEMI (TAG 1ドル 'nonterminal :children 3ドル) ; rules: RULES_PART ;; Map a parenthesis-block-like lexical token (EXPANDFULL 1ドル 'rules) ; rules: COLON () OR () SEMI () rhs rhs (let* ((rhs 1ドル) name type comps prec action elt) … (TAG name 'rule :type type :value comps :prec prec :expr action) ) ;
In such cases, when it is difficult for Emacs to obtain parenthesis-block-like lexical tokens, the best solution is to use the traditional Bison style with error recovery!
In some extreme cases, it can also be convenient to extend the lexer, to deliver new lexical tokens, to simplify the grammar.
Next: Start nonterminals, Previous: Bison style, Up: Grammar styles [Contents][Index]