diff options
Diffstat (limited to 'grammar.lua')
| -rw-r--r-- | grammar.lua | 24 | 
1 files changed, 19 insertions, 5 deletions
| diff --git a/grammar.lua b/grammar.lua index 27e75f7..286723d 100644 --- a/grammar.lua +++ b/grammar.lua @@ -5,17 +5,29 @@ setfenv(1, module)  local Grammar = {} -function module.createGrammar(nonterminals, functions, terminals) +function module.createGrammar(nonterminals, triggers)    local self = {      nonterminals = nonterminals, -    functions = functions, -    terminals = terminals, +    triggers = triggers, +    context = {},    }    setmetatable(self, {__index=Grammar})    return self  end +function Grammar.pushContext(self) +  local newContext = {} +  setmetatable(newContext, {__index=self.context}) +  self.context = newContext +end +function Grammar.popContext(self) +  local mt = getmetatable(self.context) +  local oldContext = (mt and mt.__index) or {} +  self.context = oldContext +end + +  function Grammar.expandSymbol(self, sequence, index, expansion)    table.remove(sequence, index)    for i=1,#expansion do @@ -27,8 +39,10 @@ end  function Grammar.expandSequence(self, sequence, n)    local i = 1    while i <= #sequence do -    local choices = self.nonterminals[sequence[i]] +    local choices = self.nonterminals[sequence[i]] or self.context[sequence[i]]      if choices then +      local trigger = self.triggers[sequence[i]] +      if trigger then trigger(self) end        if #choices == 1 then          self:expandSymbol(sequence, i, choices[1])          return true, 0 @@ -66,7 +80,7 @@ function Grammar.expand(self, genome, maxLength)    end    local result = ''    for _, s in ipairs(sequence) do -    result = result .. s .. ' ' +    result = result .. s    end    return result  end | 
