Question

I am looking for a peg.js grammar expression for matching against:

  • "variable" # Fails
  • "variable." # Fails
  • "" # Fails
  • "variable.variable" # Ok
  • "variable.variable.variable.variable.variable" #Ok

input I expect

  • {PATH: "variable.variable"}
  • {PATH: "variable.variable.variable.variable.variable"}

Sample.pegjs

start = 
    PATH_EXP

STRING_EXP =
    chars:[0-9a-zA-Z_]+ { return chars.join(""); }

PATH_EXP =    
    path:(STRING_EXP "." STRING_EXP) { return {PATH: path.join("")}; }

I don't know how to make the expression repeat, but also make it optional.

Was it helpful?

Solution

Here's what I came up with to get rid of the "." characters. I'll admit that I've never used peg.js before :)

PATH_EXP =    
    (first:STRING_EXP rest:("." STRING_EXP)*) {
      return {
        PATH: first +  
              rest.map(function(v) {
                return v[1]; 
              }).join("")
      };
    }

edit — oh wait this is better:

PATH_EXP = 
    first:STRING_EXP rest:("." s:STRING_EXP { return "." + s; })+ {
      return {
        PATH: first + rest.join('')
      };
    }

edit — clearly if you want the "." characters you'd include them in the action inside that second part. Missed that part of the question.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top