2014-09-28 2 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