Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit ff86dc2

Browse files
authored
Allow quoted identifiers (#23)
1 parent f227556 commit ff86dc2

File tree

15 files changed

+195
-75
lines changed

15 files changed

+195
-75
lines changed

‎.github/workflows/ci-interpreter.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
- name: Setup OCaml
2222
uses: ocaml/setup-ocaml@v2
2323
with:
24-
ocaml-compiler: 4.12.x
24+
ocaml-compiler: 4.14.x
2525
- name: Setup OCaml tools
2626
run: opam install --yes ocamlfind.1.9.5 js_of_ocaml.4.0.0 js_of_ocaml-ppx.4.0.0
2727
- name: Setup Node.js

‎document/core/text/conventions.rst‎

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,20 +120,21 @@ It is convenient to define identifier contexts as :ref:`records <notation-record
120120
\begin{array}{llll}
121121
\production{identifier context} & I &::=&
122122
\begin{array}[t]{l@{~}ll}
123-
\{ & \ITYPES & (\Tid^?)^\ast, \\
124-
& \IFUNCS & (\Tid^?)^\ast, \\
125-
& \ITABLES & (\Tid^?)^\ast, \\
126-
& \IMEMS & (\Tid^?)^\ast, \\
127-
& \IGLOBALS & (\Tid^?)^\ast, \\
128-
& \IELEM & (\Tid^?)^\ast, \\
129-
& \IDATA & (\Tid^?)^\ast, \\
130-
& \ILOCALS & (\Tid^?)^\ast, \\
131-
& \ILABELS & (\Tid^?)^\ast, \\
123+
\{ & \ITYPES & (\name^?)^\ast, \\
124+
& \IFUNCS & (\name^?)^\ast, \\
125+
& \ITABLES & (\name^?)^\ast, \\
126+
& \IMEMS & (\name^?)^\ast, \\
127+
& \IGLOBALS & (\name^?)^\ast, \\
128+
& \IELEM & (\name^?)^\ast, \\
129+
& \IDATA & (\name^?)^\ast, \\
130+
& \ILOCALS & (\name^?)^\ast, \\
131+
& \ILABELS & (\name^?)^\ast, \\
132132
& \ITYPEDEFS & \functype^\ast ~\} \\
133133
\end{array}
134134
\end{array}
135135
136-
For each index space, such a context contains the list of :ref:`identifiers <text-id>` assigned to the defined indices.
136+
For each index space, such a context contains the list of :ref:`names <syntax-name>` assigned to the defined indices,
137+
which were denoted by the corresponding :ref:`identifiers <text-id>`.
137138
Unnamed indices are associated with empty (:math:`\epsilon`) entries in these lists.
138139

139140
An identifier context is *well-formed* if no index space contains duplicate identifiers.

‎document/core/text/instructions.rst‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ The following grammar handles the corresponding update to the :ref:`identifier c
3232
.. math::
3333
\begin{array}{llcllll}
3434
\production{label} & \Tlabel_I &::=&
35-
v{:}\Tid &\Rightarrow& \{\ILABELS~v\} \compose I
35+
v{:}\Tid &\Rightarrow& v, \{\ILABELS~v\} \compose I
3636
& (\iff v \notin I.\ILABELS) \\ &&|&
37-
v{:}\Tid &\Rightarrow& \{\ILABELS~v\} \compose (I \with \ILABELS[i] = \epsilon)
37+
v{:}\Tid &\Rightarrow& v, \{\ILABELS~v\} \compose (I \with \ILABELS[i] = \epsilon)
3838
& (\iff I.\ILABELS[i] = v) \\ &&|&
39-
\epsilon &\Rightarrow& \{\ILABELS~(\epsilon)\} \compose I \\
39+
\epsilon &\Rightarrow& \epsilon, \{\ILABELS~(\epsilon)\} \compose I \\
4040
\end{array}
4141
4242
.. note::
@@ -79,16 +79,16 @@ However, the special case of a type use that is syntactically empty or consists
7979
x,I'{:}\Ttypeuse_I &\Rightarrow& x & (\iff I' = \{\ILOCALS~(\epsilon)^\ast\}) \\
8080
\end{array} \\
8181
\production{block instruction} & \Tblockinstr_I &::=&
82-
\text{block}~~I'{:}\Tlabel_I~~\X{bt}{:}\Tblocktype_I~~(\X{in}{:}\Tinstr_{I'})^\ast~~\text{end}~~\Tid^?
82+
\text{block}~~(v^?,I'){:}\Tlabel_I~~\X{bt}{:}\Tblocktype_I~~(\X{in}{:}\Tinstr_{I'})^\ast~~\text{end}~~{v'}^?{:}\Tid^?
8383
\\ &&&\qquad \Rightarrow\quad \BLOCK~\X{bt}~\X{in}^\ast~\END
84-
\qquad\quad~~ (\iff \Tid^? = \epsilon \vee \Tid^? = \Tlabel) \\ &&|&
85-
\text{loop}~~I'{:}\Tlabel_I~~\X{bt}{:}\Tblocktype_I~~(\X{in}{:}\Tinstr_{I'})^\ast~~\text{end}~~\Tid^?
84+
\qquad\quad~~ (\iff {v'}^? = \epsilon \vee {v'}^? = v^?) \\ &&|&
85+
\text{loop}~~(v^?,I'){:}\Tlabel_I~~\X{bt}{:}\Tblocktype_I~~(\X{in}{:}\Tinstr_{I'})^\ast~~\text{end}~~{v'}^?{:}\Tid^?
8686
\\ &&&\qquad \Rightarrow\quad \LOOP~\X{bt}~\X{in}^\ast~\END
87-
\qquad\qquad (\iff \Tid^? = \epsilon \vee \Tid^? = \Tlabel) \\ &&|&
88-
\text{if}~~I'{:}\Tlabel_I~~\X{bt}{:}\Tblocktype_I~~(\X{in}_1{:}\Tinstr_{I'})^\ast~~
89-
\text{else}~~\Tid_1^?~~(\X{in}_2{:}\Tinstr_{I'})^\ast~~\text{end}~~\Tid_2^?
87+
\qquad\qquad (\iff {v'}^? = \epsilon \vee {v'}^? = v^?) \\ &&|&
88+
\text{if}~~(v^?,I'){:}\Tlabel_I~~\X{bt}{:}\Tblocktype_I~~(\X{in}_1{:}\Tinstr_{I'})^\ast~~
89+
\text{else}~~v_1^?{:}\Tid_1^?~~(\X{in}_2{:}\Tinstr_{I'})^\ast~~\text{end}~~v_2^?{:}\Tid_2^?
9090
\\ &&&\qquad \Rightarrow\quad \IF~\X{bt}~\X{in}_1^\ast~\ELSE~\X{in}_2^\ast~\END
91-
\qquad (\iff \Tid_1^? = \epsilon \vee \Tid_1^? = \Tlabel, \Tid_2^? = \epsilon \vee \Tid_2^? = \Tlabel) \\
91+
\qquad (\iff v_1^? = \epsilon \vee v_1^? = v^?, v_2^? = \epsilon \vee v_2^? = v^?) \\
9292
\end{array}
9393
9494
.. note::

‎document/core/text/lexical.rst‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ The *look-ahead* restrictions on the productions for |Tblockchar| disambiguate t
135135
Annotations
136136
~~~~~~~~~~~
137137

138-
An *annotation* is a bracketed token sequence headed by an *annotation id* of the form :math:`\T{@id}`.
138+
An *annotation* is a bracketed token sequence headed by an *annotation id* of the form :math:`\text{@id}` or :math:`\text{@"..."}`.
139139
No :ref:`space <text-space>` is allowed between the opening parenthesis and this id.
140140
Annotations are intended to be used for third-party extensions;
141141
they can appear anywhere in a program but are ignored by the WebAssembly semantics itself, which treats them as :ref:`white space <text-space>`.
@@ -145,8 +145,10 @@ Annotations can contain other parenthesized token sequences (including nested an
145145

146146
.. math::
147147
\begin{array}{llclll@{\qquad\qquad}l}
148-
\production{annot} & \Tannot &::=&
149-
\text{(@}~\Tidchar^+ ~(\Tspace ~|~ \Ttoken)^\ast~\text{)} \\
148+
\production{annotation} & \Tannot &::=&
149+
\text{(@}~\Tannotid ~(\Tspace ~|~ \Ttoken)^\ast~\text{)} \\
150+
\production{annotation identifier} & \Tannotid &::=&
151+
\Tidchar^+ ~|~ \Tname \\
150152
\end{array}
151153
152154
.. note::

‎document/core/text/modules.rst‎

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -679,28 +679,28 @@ The definition of the initial :ref:`identifier context <text-context>` :math:`I`
679679

680680
.. math::
681681
\begin{array}{@{}lcl@{\qquad\qquad}l}
682-
\F{idc}(\text{(}~\text{type}~\Tid^?~\X{ft}{:}\Tfunctype~\text{)}) &=&
683-
\{\ITYPES~(\Tid^?), \ITYPEDEFS~\X{ft}\} \\
684-
\F{idc}(\text{(}~\text{func}~\Tid^?~\dots~\text{)}) &=&
685-
\{\IFUNCS~(\Tid^?)\} \\
686-
\F{idc}(\text{(}~\text{table}~\Tid^?~\dots~\text{)}) &=&
687-
\{\ITABLES~(\Tid^?)\} \\
688-
\F{idc}(\text{(}~\text{memory}~\Tid^?~\dots~\text{)}) &=&
689-
\{\IMEMS~(\Tid^?)\} \\
690-
\F{idc}(\text{(}~\text{global}~\Tid^?~\dots~\text{)}) &=&
691-
\{\IGLOBALS~(\Tid^?)\} \\
692-
\F{idc}(\text{(}~\text{elem}~\Tid^?~\dots~\text{)}) &=&
693-
\{\IELEM~(\Tid^?)\} \\
694-
\F{idc}(\text{(}~\text{data}~\Tid^?~\dots~\text{)}) &=&
695-
\{\IDATA~(\Tid^?)\} \\
696-
\F{idc}(\text{(}~\text{import}~\dots~\text{(}~\text{func}~\Tid^?~\dots~\text{)}~\text{)}) &=&
697-
\{\IFUNCS~(\Tid^?)\} \\
698-
\F{idc}(\text{(}~\text{import}~\dots~\text{(}~\text{table}~\Tid^?~\dots~\text{)}~\text{)}) &=&
699-
\{\ITABLES~(\Tid^?)\} \\
700-
\F{idc}(\text{(}~\text{import}~\dots~\text{(}~\text{memory}~\Tid^?~\dots~\text{)}~\text{)}) &=&
701-
\{\IMEMS~(\Tid^?)\} \\
702-
\F{idc}(\text{(}~\text{import}~\dots~\text{(}~\text{global}~\Tid^?~\dots~\text{)}~\text{)}) &=&
703-
\{\IGLOBALS~(\Tid^?)\} \\
682+
\F{idc}(\text{(}~\text{type}~v^?{:}\Tid^?~\X{ft}{:}\Tfunctype~\text{)}) &=&
683+
\{\ITYPES~(v^?), \ITYPEDEFS~\X{ft}\} \\
684+
\F{idc}(\text{(}~\text{func}~v^?{:}\Tid^?~\dots~\text{)}) &=&
685+
\{\IFUNCS~(v^?)\} \\
686+
\F{idc}(\text{(}~\text{table}~v^?{:}\Tid^?~\dots~\text{)}) &=&
687+
\{\ITABLES~(v^?)\} \\
688+
\F{idc}(\text{(}~\text{memory}~v^?{:}\Tid^?~\dots~\text{)}) &=&
689+
\{\IMEMS~(v^?)\} \\
690+
\F{idc}(\text{(}~\text{global}~v^?{:}\Tid^?~\dots~\text{)}) &=&
691+
\{\IGLOBALS~(v^?)\} \\
692+
\F{idc}(\text{(}~\text{elem}~v^?{:}\Tid^?~\dots~\text{)}) &=&
693+
\{\IELEM~(v^?)\} \\
694+
\F{idc}(\text{(}~\text{data}~v^?{:}\Tid^?~\dots~\text{)}) &=&
695+
\{\IDATA~(v^?)\} \\
696+
\F{idc}(\text{(}~\text{import}~\dots~\text{(}~\text{func}~v^?{:}\Tid^?~\dots~\text{)}~\text{)}) &=&
697+
\{\IFUNCS~(v^?)\} \\
698+
\F{idc}(\text{(}~\text{import}~\dots~\text{(}~\text{table}~v^?{:}\Tid^?~\dots~\text{)}~\text{)}) &=&
699+
\{\ITABLES~(v^?)\} \\
700+
\F{idc}(\text{(}~\text{import}~\dots~\text{(}~\text{memory}~v^?{:}\Tid^?~\dots~\text{)}~\text{)}) &=&
701+
\{\IMEMS~(v^?)\} \\
702+
\F{idc}(\text{(}~\text{import}~\dots~\text{(}~\text{global}~v^?{:}\Tid^?~\dots~\text{)}~\text{)}) &=&
703+
\{\IGLOBALS~(v^?)\} \\
704704
\F{idc}(\text{(}~\dots~\text{)}) &=&
705705
\{\} \\
706706
\end{array}

‎document/core/text/values.rst‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,13 @@ Identifiers
211211
~~~~~~~~~~~
212212

213213
:ref:`Indices <syntax-index>` can be given in both numeric and symbolic form.
214-
Symbolic *identifiers* that stand in lieu of indices start with :math:`\text{\$}`, followed by any sequence of printable |ASCII|_ characters that does not contain a space, quotation mark, comma, semicolon, or bracket.
214+
Symbolic *identifiers* that stand in lieu of indices start with :math:`\text{\$}`, followed by eiter a sequence of printable |ASCII|_ characters that does not contain a space, quotation mark, comma, semicolon, or bracket, or by a quoted :ref:`name <text-name>`.
215215

216216
.. math::
217217
\begin{array}{llclll@{\qquad}l}
218218
\production{identifier} & \Tid &::=&
219-
\text{\$}~\Tidchar^+ \\
219+
\text{\$}~c^\ast{:}\Tidchar^+ &\Rightarrow& c^\ast \\ &&|&
220+
\text{\$}~c^\ast{:}\Tname &\Rightarrow& c^\ast & (\iff |c^\ast| > 0) \\
220221
\production{identifier character} & \Tidchar &::=&
221222
\text{0} ~~|~~ \dots ~~|~~ \text{9} \\ &&|&
222223
\text{A} ~~|~~ \dots ~~|~~ \text{Z} \\ &&|&
@@ -246,6 +247,9 @@ Symbolic *identifiers* that stand in lieu of indices start with :math:`\text{\$}
246247
\text{\tilde{~~}} \\
247248
\end{array}
248249
250+
.. note::
251+
The value of an identifier character is its the Unicode codepoint denoting it.
252+
249253
.. _text-id-fresh:
250254

251255
Conventions

‎document/core/util/macros.def‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,7 @@
719719
.. |Tblockchar| mathdef:: \xref{text/lexical}{text-comment}{\T{blockchar}}
720720

721721
.. |Tannot| mathdef:: \xref{text/lexical}{text-annot}{\T{annot}}
722+
.. |Tannotid| mathdef:: \xref{text/lexical}{text-annot}{\T{annotid}}
722723
.. |Tannottoken| mathdef:: \xref{text/lexical}{text-annot}{\T{annottoken}}
723724

724725

‎interpreter/text/arrange.ml‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,10 @@ let custom m mnode (module S : Custom.Section) =
627627

628628
let var_opt = function
629629
| None -> ""
630-
| Some x -> " " ^ x.it
630+
| Some x when
631+
String.for_all (fun c -> Lib.Char.is_alphanum_ascii c || c = '_') x.it ->
632+
" $" ^ x.it
633+
| Some x -> " $" ^ name (Utf8.decode x.it)
631634

632635
let module_with_var_opt x_opt (m, cs) =
633636
let fx = ref 0 in

‎interpreter/text/lexer.mll‎

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ let string s =
4848
done;
4949
Buffer.contents b
5050

51+
let annot_id lexbuf s =
52+
let s' = string s in
53+
if s' = "" then error lexbuf "empty annotation id";
54+
try Utf8.decode s' with Utf8.Utf8 -> error lexbuf "malformed UTF-8 encoding"
55+
5156
let opt = Lib.Option.get
5257
}
5358

@@ -102,8 +107,7 @@ let float =
102107
let string = '"' character* '"'
103108

104109
let idchar = letter | digit | '_' | symbol
105-
let name = idchar+
106-
let id = '$' name
110+
let id = idchar+
107111

108112
let keyword = ['a'-'z'] (letter | digit | '_' | '.' | ':')+
109113
let reserved = (idchar | string)+ | ',' | ';' | '[' | ']' | '{' | '}'
@@ -699,13 +703,21 @@ rule token = parse
699703
| "offset="(nat as s) { OFFSET_EQ_NAT s }
700704
| "align="(nat as s) { ALIGN_EQ_NAT s }
701705

702-
| id as s { VAR s }
706+
| '$'(id as s) { VAR s }
707+
| '$'(string as s)
708+
{ let s' = string s in
709+
if s' = "" then error lexbuf "empty identifier"; VAR s' }
710+
| '$' { error lexbuf "empty identifier" }
703711

704-
| "(@"(name as n)
712+
| "(@"(id as n)
705713
{ let r = region lexbuf in
706714
let items = annot (Lexing.lexeme_start_p lexbuf) lexbuf in
707715
Annot.record (Annot.{name = Utf8.decode n; items} @@ r); token lexbuf }
708-
| "(@" { error lexbuf "malformed annotation id" }
716+
| "(@"(string as s)
717+
{ let r = region lexbuf in
718+
let items = annot (Lexing.lexeme_start_p lexbuf) lexbuf in
719+
Annot.record (Annot.{name = annot_id lexbuf s; items} @@ r); token lexbuf }
720+
| "(@" { error lexbuf "empty annotation id" }
709721

710722
| ";;"utf8_no_nl*eof { EOF }
711723
| ";;"utf8_no_nl*newline { Lexing.new_line lexbuf; token lexbuf }
@@ -726,11 +738,16 @@ and annot start = parse
726738
{ let r = region lexbuf in
727739
let items = annot (Lexing.lexeme_start_p lexbuf) lexbuf in
728740
(Annot.Parens items @@ r) :: annot start lexbuf }
729-
| "(@"(name as n)
741+
| "(@"(id as n)
730742
{ let r = region lexbuf in
731743
let items = annot (Lexing.lexeme_start_p lexbuf) lexbuf in
732744
let ann = Annot.{name = Utf8.decode n; items} @@ r in
733745
(Annot.Annot ann @@ r) :: annot start lexbuf }
746+
| "(@"(string as s)
747+
{ let r = region lexbuf in
748+
let items = annot (Lexing.lexeme_start_p lexbuf) lexbuf in
749+
let ann = Annot.{name = annot_id lexbuf s; items} @@ r in
750+
(Annot.Annot ann @@ r) :: annot start lexbuf }
734751

735752
| nat as s
736753
{ let r = region lexbuf in
@@ -741,9 +758,15 @@ and annot start = parse
741758
| float as s
742759
{ let r = region lexbuf in
743760
(Annot.Float s @@ r) :: annot start lexbuf }
744-
| id as s
761+
| '$'(id as s)
745762
{ let r = region lexbuf in
746763
(Annot.Var s @@ r) :: annot start lexbuf }
764+
| '$'(string as s)
765+
{ let r = region lexbuf in
766+
let s' = string s in
767+
if s' = "" then error lexbuf "empty identifier";
768+
(Annot.Var s' @@ r) :: annot start lexbuf }
769+
| '$' { error lexbuf "empty identifier" }
747770
| string as s
748771
{ let r = region lexbuf in
749772
(Annot.String (string s) @@ r) :: annot start lexbuf }

‎interpreter/text/parser.mly‎

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ let nat32 s loc =
8888
let name s loc =
8989
try Utf8.decode s with Utf8.Utf8 -> error (at loc) "malformed UTF-8 encoding"
9090

91+
let var s loc =
92+
let r = at loc in
93+
try ignore (Utf8.decode s); Source.(s @@ r)
94+
with Utf8.Utf8 -> error r "malformed UTF-8 encoding"
95+
9196

9297
(* Symbolic variables *)
9398

@@ -120,9 +125,24 @@ let force_locals (c : context) =
120125
let enter_func (c : context) =
121126
{c with labels = VarMap.empty; locals = empty ()}
122127

128+
let print_char = function
129+
| 0x09 -> "\\t"
130+
| 0x0a -> "\\n"
131+
| 0x22 -> "\\\""
132+
| 0x5c -> "\\\\"
133+
| c when 0x20 <= c && c < 0x7f -> String.make 1 (Char.chr c)
134+
| c -> Printf.sprintf "\\u{%02x}" c
135+
136+
let print x =
137+
"$" ^
138+
if String.for_all (fun c -> Lib.Char.is_alphanum_ascii c || c = '_') x.it
139+
then x.it
140+
else "\"" ^ String.concat "" (List.map print_char (Utf8.decode x.it)) ^ "\""
141+
142+
123143
let lookup category space x =
124144
try VarMap.find x.it space.map
125-
with Not_found -> error x.at ("unknown " ^ category ^ " " ^ x.it)
145+
with Not_found -> error x.at ("unknown " ^ category ^ " " ^ print x)
126146

127147
let type_ (c : context) x = lookup "type" c.types.space x
128148
let func (c : context) x = lookup "function" c.funcs x
@@ -134,7 +154,7 @@ let elem (c : context) x = lookup "elem segment" c.elems x
134154
let data (c : context) x = lookup "data segment" c.datas x
135155
let label (c : context) x =
136156
try VarMap.find x.it c.labels
137-
with Not_found -> error x.at ("unknown label " ^ x.it)
157+
with Not_found -> error x.at ("unknown label " ^ print x)
138158

139159
let func_type (c : context) x =
140160
try (Lib.List32.nth c.types.list x.it).it
@@ -151,7 +171,7 @@ let anon category space n =
151171
let bind category space x =
152172
let i = anon category space 1l in
153173
if VarMap.mem x.it space.map then
154-
error x.at ("duplicate " ^ category ^ " " ^ x.it);
174+
error x.at ("duplicate " ^ category ^ " " ^ print x);
155175
space.map <- VarMap.add x.it i space.map;
156176
i
157177

@@ -336,8 +356,8 @@ num :
336356
| FLOAT { $1 @@ $sloc }
337357

338358
var :
339-
| NAT { let at = $sloc in fun c lookup -> nat32 $1 at @@ at }
340-
| VAR { let at = $sloc in fun c lookup -> lookup c ($1 @@ at) @@ at }
359+
| NAT { fun c lookup -> nat32 $1 $sloc @@ $sloc }
360+
| VAR { fun c lookup -> lookup c (var $1 $sloc) @@ $sloc }
341361

342362
var_list :
343363
| /* empty */ { fun c lookup -> [] }
@@ -348,7 +368,7 @@ bind_var_opt :
348368
| bind_var { fun c anon bind -> bind c $1 } /* Sugar */
349369

350370
bind_var :
351-
| VAR { $1 @@ $sloc }
371+
| VAR { var $1 $sloc }
352372

353373
labeling_opt :
354374
| /* empty */
@@ -1001,7 +1021,7 @@ module_fields1 :
10011021
{m with exports = $1 c :: m.exports} }
10021022

10031023
module_var :
1004-
| VAR { $1 @@ $sloc } /* Sugar */
1024+
| VAR { var $1 $sloc } /* Sugar */
10051025

10061026
module_ :
10071027
| LPAR MODULE option(module_var) module_fields RPAR
@@ -1026,7 +1046,7 @@ inline_module1 : /* Sugar */
10261046
/* Scripts */
10271047

10281048
script_var :
1029-
| VAR { $1 @@ $sloc } /* Sugar */
1049+
| VAR { var $1 $sloc } /* Sugar */
10301050

10311051
script_module :
10321052
| module_ { $1 }

0 commit comments

Comments
 (0)