Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/interscript/isc/generator.rb
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ def item(i)
when Interscript::Node::Item::Any
any(i)
when Interscript::Node::Item::Alias
identifier(i.name)
i.map ? "#{i.map}.#{identifier(i.name)}" : identifier(i.name)
when Interscript::Node::Item::CaptureGroup
"capture(#{item(i.data)})"
when Interscript::Node::Item::CaptureRef
Expand Down
4 changes: 3 additions & 1 deletion lib/interscript/isc/grammar/concerns/items.rb
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,9 @@ module Items
end

rule(:alias_reference) do
(keyword.absent? >> identifier >> str("{").absent?).as(:alias)
(keyword.absent? >> identifier >>
(str(".") >> identifier.as(:qualified_name)).maybe >>
str("{").absent?).as(:alias)
end

# ref(N) — reference to Nth capture group. Only valid in `to` position.
Expand Down
5 changes: 3 additions & 2 deletions lib/interscript/isc/items.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,11 @@ def inspect
end

class AliasRef
attr_reader :name
attr_reader :name, :map

def initialize(name)
def initialize(name, map: nil)
@name = name
@map = map
end

def inspect
Expand Down
6 changes: 5 additions & 1 deletion lib/interscript/isc/node_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ def convert_item(item)
when Items::Primitive
convert_primitive(item)
when Items::AliasRef
Interscript::Node::Item::Alias.new(item.name.to_sym)
convert_alias_ref(item)
when Items::Capture
Interscript::Node::Item::CaptureRef.new(item.index)
when Items::Function
Expand Down Expand Up @@ -190,6 +190,10 @@ def convert_primitive(item)
Interscript::Node::Item::Alias.new(item.name.to_sym)
end

def convert_alias_ref(item)
Interscript::Node::Item::Alias.new(item.name.to_sym, map: item.map&.to_sym)
end

def convert_concat(concat)
parts = concat.parts.map { |p| convert_item(p) }
return parts.first if parts.size == 1
Expand Down
3 changes: 3 additions & 0 deletions lib/interscript/isc/transform.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ class Transform < Parslet::Transform
rule(none: simple(:_)) { Items::None.new }
rule(primitive: simple(:p)) { Items::Primitive.new(p.to_s) }
rule(function: simple(:f)) { Items::Function.new(f.to_s) }
rule(alias: {identifier: simple(:n), qualified_name: simple(:q)}) {
Items::AliasRef.new(q.to_s, map: n.to_s)
}
rule(alias: simple(:n)) { Items::AliasRef.new(n.to_s) }
rule(ref: subtree(:h)) { Items::Capture.new(h[:digit].to_s.to_i) }
rule(capture_inner: subtree(:inner)) { Items::CaptureGroup.new(Interscript::Isc::Transform.materialize_item(inner)) }
Expand Down
Loading