Making the example slightly more complex, with rules like
result[1]=a1+b1+c1
result[2]=a2+b2+c2
using this grammar:
+uses expr from expr.ixml; identity from id.ixml
rules: rule+.
rule: identity, -"=", expr, -#a.
Module expr.ixml
+shares expr
expr: operand++op.
operand: id; number.
id: [L], [L; Nd]*.
op: ["+-×÷"].
number: ["0"-"9"]+.
Module identity.ixml has a clash with both
id and number from
expr.ixml:
+shares identity
identity: id; id, -"[", number, -"]".
id: [L]+.
number: digits, (".", digits)?.
-digits: [Nd]+.
The invoking grammar never changes:
rules: rule+.
rule: identity, -"=", expr.
In module expr.ixml nothing needs changing
expr: operand++op.
operand: id; number.
id: [L], [L; Nd]*.
op: ["+-×÷"].
number: ["0"-"9"]+.
In identity.ixml both id and
number are renamed:
identity: id_; id_, -"[", number_, -"]".
id_>id: -"@", [L]+.
number_>number: digits, ".", digits.
-digits: [Nd]+.
The rules allow either or both to be renamed in
expr.ixml instead.