diff --git a/anselme/parser/expression/secondary/infix/index.lua b/anselme/parser/expression/secondary/infix/index.lua index 738f3a6..548ea70 100644 --- a/anselme/parser/expression/secondary/infix/index.lua +++ b/anselme/parser/expression/secondary/infix/index.lua @@ -2,18 +2,8 @@ local infix = require("anselme.parser.expression.secondary.infix.infix") local operator_priority = require("anselme.common").operator_priority -local ast = require("anselme.ast") -local Call, Identifier, ArgumentTuple = ast.Call, ast.Identifier, ast.ArgumentTuple - return infix { operator = ".", identifier = "_._", priority = operator_priority["_._"], - - build_ast = function(self, left, right) - if Identifier:is(right) then - right = right:to_string() - end - return Call:new(Identifier:new(self.identifier), ArgumentTuple:new(left, right)) - end } diff --git a/anselme/parser/expression/secondary/infix/index_identifier.lua b/anselme/parser/expression/secondary/infix/index_identifier.lua new file mode 100644 index 0000000..34c5235 --- /dev/null +++ b/anselme/parser/expression/secondary/infix/index_identifier.lua @@ -0,0 +1,25 @@ +local escape = require("anselme.common").escape + +local infix = require("anselme.parser.expression.secondary.infix.infix") +local identifier = require("anselme.parser.expression.primary.identifier") + +local operator_priority = require("anselme.common").operator_priority + +local ast = require("anselme.ast") +local Call, Identifier, ArgumentTuple = ast.Call, ast.Identifier, ast.ArgumentTuple + +return infix { + operator = ".", + identifier = "_._", + priority = operator_priority["_._"], + + match = function(self, str, current_priority, primary) + local escaped = escape(self.operator) + return self.priority > current_priority and str:match("^"..escaped) and identifier:match(str:match("^.(.-)$")) + end, + + build_ast = function(self, left, right) + assert(Identifier:is(right)) + return Call:new(Identifier:new(self.identifier), ArgumentTuple:new(left, right:to_string())) + end +} diff --git a/anselme/parser/expression/secondary/init.lua b/anselme/parser/expression/secondary/init.lua index 65327cd..84171a2 100644 --- a/anselme/parser/expression/secondary/init.lua +++ b/anselme/parser/expression/secondary/init.lua @@ -44,6 +44,7 @@ local secondaries = { -- 12 r("infix.call"), -- 14 + r("infix.index_identifier"), r("infix.index"), -- 3 r("infix.assignment"), -- deported after equal