2014-09-28 4 views
1

입력이 [tag] Content [inner-tag] Inner [/inner-tag][/tag] 인 경우 [tag]과 일치하는 마감 [/tag]이 있는지 어떻게 확인할 수 있습니까?peg.js로 역 참조

지금 내 규칙은 다음 즉시 태그가 마지막 여는 태그와 일치하는지 확인 :

tagblock = 
    opentag:opentag content:content? closetag:closetag 
    { if(opentag.name != closetag.name) { 
     throw new this.SyntaxError("No closing tag found for " + opentag.name); 
     } else { 
     return { name:opentag.name, content:content } 
     } 
    } 

[tag] Content [/tag]와 함께 작동하지만 위의 중첩 된 입력을.

peg.js로 내부 재귀를 어떻게 처리합니까?

답변

1

다음은 내가 생각해 낸 것입니다.

Content = 
    (Element/Text)* 

Element = 
    startTag:sTag content:Content endTag:eTag { 
    if (startTag != endTag) { 
     throw new Error(
     "Expected [/" + startTag + "] but [/" + endTag + "] found." 
    ); 
    } 

    return { 
     name: startTag, 
     content: content 
    }; 
    } 

sTag = 
    "[" name:TagName "]" { return name; } 

eTag = 
    "[/" name:TagName "]" { return name; } 

TagName = chars:[a-z-]+ { return chars.join(""); } 
Text = chars:[^[]+ { return chars.join(""); } 

nodejs로 그로드 후 :

var PEG=require('./markup.js'); 
var str = '[tag] Content [inner-tag] Inner [/inner-tag][/tag]'; 
PEG.parse(str); 

결과는 다음과 같습니다

[ { name: 'tag', 
    content: [ 
     ' Content ', 
     { name: 'inner-tag', 
      content: [ ' Inner ' ] } 
    ] 
} ] 
+0

당신을 감사합니다! 나는 우리 모두가 [XML 예제] (https://gist.github.com/dmajda/7688943)를 발견했다고 생각한다. 내 새로운 문제는 단일 요소 (예 : 닫는 태그가없는 요소)를 허용하는 것입니다. '[tag] Content [single] [/ tag]'와 같습니다. 나는 부정적인 선견지명을 가지고 실험 해 왔지만 아직 성공하지 못했다. 어떤 아이디어? – fusepilot

+0

물론, 다른 질문을하는 것이 가장 좋습니다. 적어도이 질문과 제목을 업데이트하여 해당 질문을 캡슐화하십시오. – TML

+0

하, 그냥 그 일을 처리하는 중이 었어. https://stackoverflow.com/questions/26089940/xml-single-node-parsing-with-peg-js. 감사. – fusepilot