<?xml version="1.0"?>
<paste-with-annotations>
  <paste>
    <number>
      <integer>62531</integer>
    </number>
    <user>
      <string>db-keen</string>
    </user>
    <title>
      <string>latest dylan parser</string>
    </title>
    <contents>
      <string>/*
  Author::    Daniel Brumbaugh Keeney (http://rubyforge.org/users/db-keen)
  Copyright:: 2008 Daniel Brumbaugh Keeney
  License::   GPLv3+

  This program 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.

  This program 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 this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
*/
/* include DylanInterchangeFormat */

define parser script ()
  rule seq(opt(seq(lidfile, empty-line)), opt(body)) =&gt; tokens;
end parser;

define parser body ()
  rule seq(constituent, opt-many(seq(opt(space), &quot;;&quot;, opt(space), constituent)), opt(space), opt(seq(&quot;;&quot;, opt(space)))) =&gt; tokens;
end parser;

define parser constituent ()
  rule choice(definition, local-declaration, expression) =&gt; tokens;
end parser;

define parser macro ()
  rule choice(definition-macro-call, statement, function-macro-call) =&gt; tokens;
end parser;

define parser comma-property-list ()
  rule seq(&quot;,&quot;, opt(space), property-list) =&gt; tokens;
end parser;

define parser property-list ()
  rule seq(property, opt-many(seq(opt(space), &quot;,&quot;, opt(space), property))) =&gt; tokens;
end parser;

define parser property ()
  rule seq(symbol, opt(space), value) =&gt; tokens;
end parser;

define parser value ()
  rule basic-fragment =&gt; tokens;
end parser;

define parser body-fragment ()
  rule choice(non-statement-body-fragment, seq(statement, opt(non-statement-body-fragment))) =&gt; tokens;
end parser;

define parser list-fragment ()
  rule choice(non-statement-list-fragment, seq(statement, opt(non-statement-list-fragment))) =&gt; tokens;
end parser;

define parser basic-fragment ()
  rule choice(non-statement-basic-fragment, seq(statement, opt(non-statement-basic-fragment))) =&gt; tokens;
end parser;

define parser non-statement-body-fragment ()
  rule choice(seq(definition, opt(seq(opt(space), semicolon-fragment))), seq(local-declaration, opt(seq(opt(space), semicolon-fragment))), seq(simple-fragment, opt(seq(opt(space), body-fragment))), seq(&quot;,&quot;, opt(seq(opt(space), body-fragment))), semicolon-fragment) =&gt; tokens;
end parser;

define parser semicolon-fragment ()
  rule seq(&quot;;&quot;, opt(seq(opt(space), body-fragment))) =&gt; tokens;
end parser;

define parser non-statement-list-fragment ()
  rule choice(seq(simple-fragment, opt(seq(opt(space), list-fragment))), seq(&quot;,&quot;, opt(seq(opt(space), list-fragment)))) =&gt; tokens;
end parser;

define parser non-statement-basic-fragment ()
  rule seq(simple-fragment, opt(seq(opt(space), basic-fragment))) =&gt; tokens;
end parser;

define parser simple-fragment ()
  rule choice(function-macro-call, constant-fragment, variable-name, binary-operator, unary-operator, bracketed-fragment, pound-word, &quot;.&quot;, &quot;::&quot;, &quot;=&gt;&quot;, &quot;??&quot;, &quot;?=&quot;, &quot;?&quot;, &quot;...&quot;, &quot;##&quot;, &quot;otherwise&quot;) =&gt; tokens;
end parser;

define parser bracketed-fragment ()
  rule choice(seq(&quot;(&quot;, opt(space), opt(seq(body-fragment, opt(space))), &quot;)&quot;), seq(&quot;[&quot;, opt(space), opt(seq(body-fragment, opt(space))), &quot;]&quot;), seq(&quot;{&quot;, opt(space), opt(seq(body-fragment, opt(space))), &quot;}&quot;)) =&gt; tokens;
end parser;

define parser constant-fragment ()
  rule choice(number, character-literal, string, symbol, seq(&quot;#(&quot;, opt(space), constants, opt(space), &quot;.&quot;, opt(space), constant, opt(space), &quot;)&quot;), seq(&quot;#(&quot;, opt(space), opt(seq(constants, opt(space))), &quot;)&quot;), seq(&quot;#[&quot;, opt(space), opt(seq(constants, opt(space))), &quot;]&quot;)) =&gt; tokens;
end parser;

define parser definition ()
  rule choice(definition-macro-call, seq(&quot;define&quot;, space, &quot;macro&quot;, space, macro-definition)) =&gt; tokens;
end parser;

define parser definition-macro-call ()
  rule seq(&quot;define&quot;, space, opt-many(seq(modifier, space)), choice(seq(define-body-word, token-separator, opt(body-fragment), opt(space), definition-tail), seq(define-list-word, token-separator, opt(list-fragment)))) =&gt; tokens;
end parser;

define parser modifier ()
  rule unreserved-name =&gt; tokens;
end parser;

define parser definition-tail ()
  rule choice(seq(&quot;end&quot;, space, define-body-word, space, macro-name), seq(&quot;end&quot;, opt(seq(space, macro-name)))) =&gt; tokens;
end parser;

define parser local-declaration ()
  rule choice(seq(&quot;let&quot;, token-separator, bindings), seq(&quot;let&quot;, space, &quot;handler&quot;, space, condition, space, &quot;=&quot;, space, handler), seq(&quot;local&quot;, space, local-methods)) =&gt; tokens;
end parser;

define parser condition ()
  rule choice(type, seq(&quot;(&quot;, type, comma-property-list, &quot;)&quot;)) =&gt; tokens;
end parser;

define parser handler ()
  rule expression =&gt; tokens;
end parser;

define parser local-methods ()
  rule seq(opt(seq(&quot;method&quot;, space)), method-definition, opt-many(seq(opt(space), &quot;,&quot;, opt(space), method-definition))) =&gt; tokens;
end parser;

define parser bindings ()
  rule choice(seq(variable, space, &quot;=&quot;, space, expression), seq(&quot;(&quot;, opt(space), variable-list, opt(space), &quot;)&quot;, opt(space), &quot;=&quot;, space, expression)) =&gt; tokens;
end parser;

define parser variable-list ()
  rule choice(seq(variables, opt(seq(&quot;,&quot;, opt(space), &quot;#rest&quot;, variable-name))), seq(&quot;#rest&quot;, variable-name)) =&gt; tokens;
end parser;

define parser variables ()
  rule seq(variable, opt-many(seq(&quot;,&quot;, opt(space), variable))) =&gt; tokens;
end parser;

define parser variable ()
  rule seq(variable-name, opt(seq(opt(space), &quot;::&quot;, opt(space), type))) =&gt; tokens;
end parser;

define parser variable-name ()
  rule ordinary-name =&gt; tokens;
end parser;

define parser type ()
  rule operand =&gt; tokens;
end parser;

define parser expressions ()
  rule seq(expression, opt-many(seq(&quot;,&quot;, opt(space), expression))) =&gt; tokens;
end parser;

define parser expression ()
  rule seq(binary-operand, opt-many(seq(space, binary-operator, space, binary-operand))) =&gt; tokens;
end parser;

define parser expression-no-symbol ()
  rule seq(binary-operand-no-symbol, opt(seq(space, binary-operator, space, expression))) =&gt; tokens;
end parser;

define parser binary-operand-no-symbol ()
  rule seq(opt(unary-operator), operand) =&gt; tokens;
end parser;

define parser binary-operand ()
  rule choice(symbol, seq(opt(unary-operator), operand)) =&gt; tokens;
end parser;

define parser operand ()
  rule seq(leaf, opt-many(choice(seq(&quot;(&quot;, opt(space), opt(arguments), opt(space), &quot;)&quot;), seq(&quot;[&quot;, opt(space), opt(arguments), opt(space), &quot;]&quot;), seq(&quot;.&quot;, variable-name)))) =&gt; tokens;
end parser;

define parser function-macro-call ()
  rule seq(function-word, opt(space), &quot;(&quot;, opt(space), opt(body-fragment), &quot;)&quot;) =&gt; tokens;
end parser;

define parser leaf ()
  rule choice(literal, function-macro-call, variable-name, seq(&quot;(&quot;, expression, &quot;)&quot;), statement) =&gt; tokens;
end parser;

define parser arguments ()
  rule seq(argument, opt-many(seq(opt(space), &quot;,&quot;, opt(space), argument))) =&gt; tokens;
end parser;

define parser argument ()
  rule choice(seq(symbol, expression), expression-no-symbol, symbol) =&gt; tokens;
end parser;

define parser literal ()
  rule choice(&quot;#()&quot;, number, character-literal, string-literal, &quot;#t&quot;, &quot;#f&quot;, seq(&quot;#(&quot;, opt(space), constants, &quot;.&quot;, constant, opt(space), &quot;)&quot;), seq(&quot;#(&quot;, opt(space), opt(seq(constants, opt(space))), &quot;)&quot;), seq(&quot;#[&quot;, opt(space), opt(seq(constants, opt(space))), &quot;]&quot;)) =&gt; tokens;
end parser;

define parser string-literal ()
  rule string =&gt; tokens;
end parser;

define parser constants ()
  rule seq(constant, opt-many(seq(opt(space), &quot;,&quot;, opt(space), constant))) =&gt; tokens;
end parser;

define parser constant ()
  rule choice(literal, symbol) =&gt; tokens;
end parser;

define parser statement ()
  rule seq(begin-word, token-separator, opt(body-fragment), opt(space), end-clause) =&gt; tokens;
end parser;

define parser end-clause ()
  rule seq(&quot;end&quot;, opt(begin-word)) =&gt; tokens;
end parser;

define parser case-body ()
  rule seq(cases, opt(space), opt(&quot;;&quot;)) =&gt; tokens;
end parser;

define parser cases ()
  rule seq(case-label, opt(constituents), opt-many(seq(opt(space), &quot;;&quot;, opt(space), case-label, opt(constituents)))) =&gt; tokens;
end parser;

define parser case-label ()
  rule seq(expressions, &quot;=&gt;&quot;, opt(space), &quot;(&quot;, opt(space), expression, opt(space), &quot;,&quot;, opt(space), expressions, opt(space), &quot;)&quot;, opt(space), &quot;=&gt;&quot;, &quot;otherwise&quot;, opt(space), opt(&quot;=&gt;&quot;)) =&gt; tokens;
end parser;

define parser method-definition ()
  rule seq(variable-name, opt(space), parameter-list, opt(space), opt(body), opt(space), &quot;end&quot;, opt(seq(space, &quot;method&quot;)), opt(seq(space, variable-name))) =&gt; tokens;
end parser;

define parser parameter-list ()
  rule seq(&quot;(&quot;, opt(parameters), &quot;)&quot;, opt(space), choice(seq(&quot;=&gt;&quot;, opt(space), choice(seq(&quot;(&quot;, opt(space), opt(values-list), opt(space), &quot;)&quot;, opt(space), opt(&quot;;&quot;)), seq(variable, opt(space), &quot;;&quot;))), opt(&quot;;&quot;))) =&gt; tokens;
end parser;

define parser parameters ()
  rule choice(next-rest-key-parameter-list, seq(required-parameters, opt(seq(opt(space), &quot;,&quot;, opt(space), next-rest-key-parameter-list)))) =&gt; tokens;
end parser;

define parser next-rest-key-parameter-list ()
  rule choice(seq(&quot;#next&quot;, space, variable-name, opt(seq(opt(space), &quot;,&quot;, opt(space), rest-key-parameter-list))), rest-key-parameter-list) =&gt; tokens;
end parser;

define parser rest-key-parameter-list ()
  rule choice(seq(&quot;#rest&quot;, space, variable-name, opt(seq(opt(space), &quot;,&quot;, opt(space), key-parameter-list))), key-parameter-list) =&gt; tokens;
end parser;

define parser key-parameter-list ()
  rule seq(&quot;#key&quot;, space, opt(keyword-parameters), opt(space), &quot;,&quot;, opt(space), opt(&quot;#all-keys&quot;)) =&gt; tokens;
end parser;

define parser required-parameters ()
  rule seq(required-parameter, opt-many(seq(opt(space), &quot;,&quot;, opt(space), required-parameter))) =&gt; tokens;
end parser;

define parser required-parameter ()
  rule choice(seq(variable-name, space, &quot;==&quot;, token-separator, expression), variable) =&gt; tokens;
end parser;

define parser keyword-parameters ()
  rule seq(keyword-parameter, opt-many(seq(opt(space), &quot;,&quot;, opt(space), keyword-parameter))) =&gt; tokens;
end parser;

define parser keyword-parameter ()
  rule seq(opt(symbol), variable, opt(default)) =&gt; tokens;
end parser;

define parser default ()
  rule seq(&quot;=&quot;, token-separator, expression) =&gt; tokens;
end parser;

define parser values-list ()
  rule choice(seq(variables, opt(seq(opt(space), &quot;,&quot;, opt(space), &quot;#rest&quot;, space, variable))), seq(&quot;#rest&quot;, space, variable)) =&gt; tokens;
end parser;

define parser macro-definition ()
  rule seq(macro-name, opt(space), main-rule-set, opt(space), opt(seq(aux-rule-sets, opt(space))), &quot;end&quot;, opt(seq(space, &quot;macro&quot;)), opt(seq(space, macro-name))) =&gt; tokens;
end parser;

define parser main-rule-set ()
  rule choice(seq(body-style-definition-rule, opt-many(seq(opt(space), body-style-definition-rule))), seq(list-style-definition-rule, opt-many(seq(opt(space), list-style-definition-rule))), seq(statement-rule, opt-many(seq(opt(space), statement-rule))), seq(function-rule, opt-many(seq(opt(space), function-rule)))) =&gt; tokens;
end parser;

define parser body-style-definition-rule ()
  rule choice(seq(&quot;{&quot;, opt(space), &quot;define&quot;, token-separator, macro-name, token-separator, opt(pattern), opt(space), opt(seq(&quot;;&quot;, space)), &quot;end&quot;, opt(space), &quot;}&quot;, opt(space), &quot;=&gt;&quot;, token-separator, rhs), seq(&quot;{&quot;, opt(space), &quot;define&quot;, token-separator, definition-head, space, macro-name, token-separator, opt(pattern), opt(space), opt(seq(&quot;;&quot;, space)), &quot;end&quot;, opt(space), &quot;}&quot;, opt(space), &quot;=&gt;&quot;, token-separator, rhs)) =&gt; tokens;
end parser;

define parser list-style-definition-rule ()
  rule seq(&quot;{&quot;, opt(space), &quot;define&quot;, token-separator, opt(seq(definition-head, space)), macro-name, token-separator, opt(pattern), opt(space), &quot;}&quot;, opt(space), &quot;=&gt;&quot;, token-separator, rhs) =&gt; tokens;
end parser;

define parser rhs ()
  rule seq(&quot;{&quot;, opt(space), opt(seq(template, opt(space))), &quot;}&quot;, opt(seq(opt(space), &quot;;&quot;))) =&gt; tokens;
end parser;

define parser definition-head ()
  rule many(modifier-pattern) =&gt; tokens;
end parser;

define parser modifier-pattern ()
  rule choice(modifier, pattern-variable) =&gt; tokens;
end parser;

define parser statement-rule ()
  rule seq(&quot;{&quot;, opt(space), macro-name, token-separator, opt(pattern), opt(space), opt(seq(&quot;;&quot;, opt(space))), &quot;end&quot;, opt(space), &quot;}&quot;, opt(space), &quot;=&gt;&quot;, token-separator, rhs) =&gt; tokens;
end parser;

define parser function-rule ()
  rule seq(&quot;{&quot;, opt(space), macro-name, opt(space), &quot;(&quot;, opt(space), opt(pattern), opt(space), &quot;)&quot;, opt(space), &quot;}&quot;, opt(space), &quot;=&gt;&quot;, token-separator, rhs) =&gt; tokens;
end parser;

define parser pattern ()
  rule seq(pattern-list, opt-many(seq(opt(space), &quot;;&quot;, opt(space), pattern-list))) =&gt; tokens;
end parser;

define parser pattern-list ()
  rule choice(property-list-pattern, seq(pattern-sequence, opt(seq(opt(space), &quot;,&quot;, opt(space), pattern-list)))) =&gt; tokens;
end parser;

define parser pattern-sequence ()
  rule seq(simple-pattern, opt-many(seq(opt(space), simple-pattern))) =&gt; tokens;
end parser;

define parser simple-pattern ()
  rule choice(binding-pattern, pattern-variable, name-not-end, &quot;=&gt;&quot;, bracketed-pattern) =&gt; tokens;
end parser;

define parser bracketed-pattern ()
  rule choice(seq(&quot;(&quot;, opt(space), opt(seq(pattern, opt(space))), &quot;)&quot;), seq(&quot;[&quot;, opt(space), opt(seq(pattern, opt(space))), &quot;]&quot;), seq(&quot;{&quot;, opt(space), opt(seq(pattern, opt(space))), &quot;}&quot;)) =&gt; tokens;
end parser;

define parser binding-pattern ()
  rule choice(seq(pattern-variable, opt(space), &quot;::&quot;, opt(space), pattern-variable), seq(pattern-variable, opt(space), &quot;=&quot;, opt(space), pattern-variable), seq(pattern-variable, opt(space), &quot;::&quot;, opt(space), pattern-variable, opt(space), &quot;=&quot;, opt(space), pattern-variable)) =&gt; tokens;
end parser;

define parser pattern-variable ()
  rule choice(seq(&quot;?&quot;, constrained-name), seq(&quot;?&quot;, name), &quot;...&quot;) =&gt; tokens;
end parser;

define parser property-list-pattern ()
  rule choice(seq(&quot;#rest&quot;, space, pattern-variable, opt(seq(opt(space), &quot;,&quot;, opt(space), &quot;#key&quot;, token-separator, opt(pattern-keywords)))), seq(&quot;#key&quot;, token-separator, opt(pattern-keywords))) =&gt; tokens;
end parser;

define parser pattern-keywords ()
  rule choice(&quot;#all-keys&quot;, seq(pattern-keyword, opt(seq(opt(space), &quot;,&quot;, opt(space), pattern-keywords)))) =&gt; tokens;
end parser;

define parser pattern-keyword ()
  rule choice(seq(&quot;?&quot;, constrained-name, opt(seq(opt(space), default))), seq(&quot;?&quot;, name, opt(seq(opt(space), default))), seq(&quot;??&quot;, constrained-name, opt(seq(opt(space), default))), seq(&quot;??&quot;, name, opt(seq(opt(space), default)))) =&gt; tokens;
end parser;

define parser template ()
  rule seq(template-element, opt-many(seq(opt(space), template-element))) =&gt; tokens;
end parser;

define parser template-element ()
  rule choice(substitution, &quot;.&quot;, &quot;::&quot;, &quot;=&gt;&quot;, symbol, name, number, character-literal, string, separator, unary-operator, pound-word, seq(&quot;(&quot;, opt(space), opt(seq(template, opt(space))), &quot;)&quot;), seq(&quot;[&quot;, opt(space), opt(seq(template, opt(space))), &quot;]&quot;), seq(&quot;{&quot;, opt(space), opt(seq(template, opt(space))), &quot;}&quot;), seq(&quot;#(&quot;, opt(space), opt(seq(template, opt(space))), &quot;)&quot;), seq(&quot;#[&quot;, opt(space), opt(seq(template, opt(space))), &quot;]&quot;)) =&gt; tokens;
end parser;

define parser separator ()
  rule choice(/*;,*/choice(';', ','), binary-operator) =&gt; tokens;
end parser;

define parser substitution ()
  rule choice(seq(opt(seq(name-prefix, opt(space))), &quot;?&quot;, name-string-or-symbol, opt(seq(opt(space), name-suffix))), seq(&quot;??&quot;, name, opt(separator), &quot;...&quot;), &quot;...&quot;, seq(&quot;?=&quot;, name)) =&gt; tokens;
end parser;

define parser name-prefix ()
  rule seq(string, opt(space), &quot;##&quot;) =&gt; tokens;
end parser;

define parser name-suffix ()
  rule seq(&quot;##&quot;, opt(space), string) =&gt; tokens;
end parser;

define parser name-string-or-symbol ()
  rule choice(name, string, symbol) =&gt; tokens;
end parser;

define parser aux-rule-sets ()
  rule seq(aux-rule-set, opt-many(seq(opt(space), aux-rule-set))) =&gt; tokens;
end parser;

define parser aux-rule-set ()
  rule seq(symbol, opt(space), aux-rules) =&gt; tokens;
end parser;

define parser aux-rules ()
  rule seq(aux-rule, opt-many(seq(opt(space), aux-rule))) =&gt; tokens;
end parser;

define parser aux-rule ()
  rule seq(&quot;{&quot;, opt(space), opt(seq(pattern, opt(space))), &quot;}&quot;, opt(space), &quot;=&gt;&quot;, token-separator, rhs) =&gt; tokens;
end parser;

define parser comment ()
  rule choice(single-line-comment, multiline-comment) =&gt; tokens;
end parser;

define parser multiline-comment ()
  rule seq(&quot;/*&quot;, opt-many(seq(not-next(&quot;*/&quot;), char)), &quot;*/&quot;) =&gt; tokens;
end parser;

define parser single-line-comment ()
  rule seq(&quot;//&quot;, opt-many(seq(not-next(eol), char)), eol) =&gt; tokens;
end parser;

define parser eol ()
  rule &quot;\n&quot; =&gt; tokens;
end parser;

define parser token ()
  rule choice(name, symbol, number, character-literal, string, unary-operator, binary-operator, punctuation, pound-word) =&gt; tokens;
end parser;

define parser punctuation ()
  rule choice(&quot;(&quot;, &quot;)&quot;, &quot;,&quot;, &quot;.&quot;, &quot;;&quot;, &quot;[&quot;, &quot;]&quot;, &quot;{&quot;, &quot;}&quot;, &quot;::&quot;, &quot;-&quot;, &quot;==&quot;, &quot;=&gt;&quot;, &quot;=&quot;, &quot;#(&quot;, &quot;#[&quot;, &quot;##&quot;, &quot;??&quot;, &quot;?=&quot;, &quot;?&quot;, &quot;...&quot;) =&gt; tokens;
end parser;

define parser pound-word ()
  rule choice(&quot;#t&quot;, &quot;#f&quot;, &quot;#next&quot;, &quot;#rest&quot;, &quot;#key&quot;, &quot;#all-keys&quot;, &quot;#include&quot;) =&gt; tokens;
end parser;

define parser reserved-word ()
  rule choice(core-word, begin-word, define-body-word, define-list-word) =&gt; tokens;
end parser;

define parser core-word ()
  rule seq(choice(&quot;define&quot;, &quot;end&quot;, &quot;handler&quot;, &quot;let&quot;, &quot;local&quot;, &quot;macro&quot;, &quot;otherwise&quot;), req-next(token-separator)) =&gt; tokens;
end parser;

define parser begin-word ()
  rule seq(choice(&quot;begin&quot;, &quot;block&quot;, &quot;case&quot;, &quot;for&quot;, &quot;if&quot;, &quot;method&quot;, &quot;select&quot;, &quot;unless&quot;, &quot;until&quot;, &quot;while&quot;), req-next(token-separator)) =&gt; tokens;
end parser;

define parser function-word ()
  rule seq(not-next(reserved-word), word) =&gt; tokens;
end parser;

define parser define-body-word ()
  rule seq(choice(&quot;class&quot;, &quot;library&quot;, &quot;method&quot;, &quot;module&quot;), req-next(token-separator)) =&gt; tokens;
end parser;

define parser define-list-word ()
  rule seq(choice(&quot;constant&quot;, &quot;variable&quot;, &quot;domain&quot;), req-next(token-separator)) =&gt; tokens;
end parser;

define parser name ()
  rule choice(word, seq(&quot;\' word &quot;, operator-name)) =&gt; tokens;
end parser;

define parser unreserved-name ()
  rule choice(seq(not-next(reserved-word), word), seq(&quot;\\&quot;, word), operator-name) =&gt; tokens;
end parser;

define parser ordinary-name ()
  rule choice(unreserved-name, define-body-word, define-list-word) =&gt; tokens;
end parser;

define parser constrained-name ()
  rule choice(seq(name, &quot;:&quot;, word), seq(name, &quot;:&quot;, binary-operator), seq(&quot;:&quot;, word)) =&gt; tokens;
end parser;

define parser operator-name ()
  rule choice(seq(&quot;\\&quot;, unary-operator), seq(&quot;\\&quot;, binary-operator)) =&gt; tokens;
end parser;

define parser macro-name ()
  rule choice(ordinary-name, begin-word, function-word) =&gt; tokens;
end parser;

define parser name-not-end ()
  rule seq(choice(macro-name, &quot;define&quot;, &quot;handler&quot;, &quot;let&quot;, &quot;local&quot;, &quot;macro&quot;, &quot;otherwise&quot;), req-next(token-separator)) =&gt; tokens;
end parser;

define parser symbol ()
  rule choice(seq(word, &quot;:&quot;), seq(&quot;#&quot;, string)) =&gt; tokens;
end parser;

define parser word ()
  rule choice(leading-alphabetic, seq(leading-numeric, alphabetic-character, leading-alphabetic), seq(leading-graphic, leading-alphabetic)) =&gt; tokens;
end parser;

define parser leading-alphabetic ()
  rule seq(alphabetic-character, opt-many(any-character)) =&gt; tokens;
end parser;

define parser leading-numeric ()
  rule seq(numeric-character, opt-many(word-character-not-double-alphabetic)) =&gt; tokens;
end parser;

define parser leading-graphic ()
  rule seq(graphic-character, opt-many(word-character-not-alphabetic)) =&gt; tokens;
end parser;

define parser word-character-not-alphabetic ()
  rule choice(numeric-character, graphic-character, special-character) =&gt; tokens;
end parser;

define parser word-character-not-double-alphabetic ()
  rule choice(seq(alphabetic-character, word-character-not-alphabetic), numeric-character, graphic-character, special-character) =&gt; tokens;
end parser;

define parser any-character ()
  rule choice(alphabetic-character, numeric-character, graphic-character, special-character) =&gt; tokens;
end parser;

define parser alphabetic-character ()
  rule /*abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ*/choice('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z') =&gt; tokens;
end parser;

define parser numeric-character ()
  rule /*0123456789*/choice('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') =&gt; tokens;
end parser;

define parser graphic-character ()
  rule /*!&amp;*&lt;&gt;|^$%@_*/choice('!', '&amp;', '*', '&lt;', '&gt;', '|', '^', '$', '%', '@', '_') =&gt; tokens;
end parser;

define parser special-character ()
  rule /*-+~?/=*/choice('-', '+', '~', '?', '/', '=') =&gt; tokens;
end parser;

define parser unary-operator ()
  rule /*-~*/choice('-', '~') =&gt; tokens;
end parser;

define parser binary-operator ()
  rule choice(&quot;==&quot;, &quot;~==&quot;, &quot;~=&quot;, &quot;&lt;=&quot;, &quot;&gt;=&quot;, &quot;:=&quot;, /*\+\-\*\/\^\=\&lt;\&gt;\&amp;\|*/choice('+', '-', '*', '/', '^', '=', '&lt;', '&gt;', '&amp;', '|')) =&gt; tokens;
end parser;

define parser character-literal ()
  rule seq(&quot;'&quot;, character, &quot;'&quot;) =&gt; tokens;
end parser;

define parser character ()
  rule choice(seq(not-next(&quot;'&quot;), not-next(&quot;\\&quot;), printing-character), seq(&quot;\\&quot;, escape-character)) =&gt; tokens;
end parser;

define parser string ()
  rule seq(&quot;&quot;&quot;, opt-many(string-character), &quot;&quot;&quot;) =&gt; tokens;
end parser;

define parser string-character ()
  rule choice(seq(not-next(&quot;&quot;&quot;), not-next(&quot;\\&quot;), printing-character), seq(&quot;\\&quot;, escape-character)) =&gt; tokens;
end parser;

define parser escape-character ()
  rule choice(/*\\'&quot;abefnrt0*/choice('\', ''', '&quot;', 'a', 'b', 'e', 'f', 'n', 'r', 't', '0'), seq(&quot;&lt;&quot;, many(hex-digit), &quot;&gt;&quot;)) =&gt; tokens;
end parser;

define parser number ()
  rule choice(integer, ratio, floating-point) =&gt; tokens;
end parser;

define parser integer ()
  rule choice(binary-integer, octal-integer, seq(opt(sign), decimal-integer), hex-integer) =&gt; tokens;
end parser;

define parser binary-integer ()
  rule seq(&quot;#&quot;, /*bB*/choice('b', 'B'), many(/*01*/choice('0', '1'))) =&gt; tokens;
end parser;

define parser octal-integer ()
  rule seq(&quot;#&quot;, /*oO*/choice('o', 'O'), many(/*01234567*/choice('0', '1', '2', '3', '4', '5', '6', '7'))) =&gt; tokens;
end parser;

define parser decimal-integer ()
  rule many(/*0123456789*/choice('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')) =&gt; tokens;
end parser;

define parser hex-integer ()
  rule seq(&quot;#&quot;, /*xX*/choice('x', 'X'), many(hex-digit)) =&gt; tokens;
end parser;

define parser hex-digit ()
  rule /*0123456789ABCDEFabcdef*/choice('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'a', 'b', 'c', 'd', 'e', 'f') =&gt; tokens;
end parser;

define parser ratio ()
  rule seq(opt(sign), decimal-integer, &quot;/&quot;, decimal-integer) =&gt; tokens;
end parser;

define parser floating-point ()
  rule seq(opt(sign), choice(seq(opt(decimal-integer), &quot;.&quot;, decimal-integer, opt(exponent)), seq(decimal-integer, &quot;.&quot;, opt(decimal-integer), opt(exponent)), seq(decimal-integer, exponent))) =&gt; tokens;
end parser;

define parser exponent ()
  rule seq(/*eE*/choice('e', 'E'), opt(sign), decimal-integer) =&gt; tokens;
end parser;

define parser sign ()
  rule /*+-*/choice('+', '-') =&gt; tokens;
end parser;

define parser printing-character ()
  rule char =&gt; tokens;
end parser;

define parser keyword ()
  rule seq(name, &quot;:&quot;) =&gt; tokens;
end parser;

define parser token-separator ()
  rule choice(space, req-next(/*(),;\[\]{}*/choice('(', ')', ',', ';', '[', ']', '{', '}')), not-next(char)) =&gt; tokens;
end parser;

define parser space ()
  rule many(choice(many(/* \t\v\r\n*/choice(' ', 't', 'v', 'r', 'n')), comment)) =&gt; tokens;
end parser;
</string>
    </contents>
    <universal-time>
      <integer>3422915420</integer>
    </universal-time>
    <channel>
      <string>#dylan</string>
    </channel>
    <colorization-mode>
      <string></string>
    </colorization-mode>
    <maybe-spam>
      <null/>
    </maybe-spam>
    <is-unicode>
      <keyword>TRUE</keyword>
    </is-unicode>
    <deletion-requested>
      <null/>
    </deletion-requested>
    <deletion-requested-email>
      <null/>
    </deletion-requested-email>
    <expiration-time>
      <null/>
    </expiration-time>
  </paste>
</paste-with-annotations>
