PEG.js

2012-07-25 19 views
9

ile ayrıştırma düzeyi düzeyi PEG for Python style indentation ile aynı soruya sahibim, ancak this answer ile ilgili biraz daha fazla yönelmek istiyorum. Yanıt, başarılı bir şekilde, satırlar arasında 'INDENT' ve 'DEDENT' ile her bir girdi satırı olan bir dizi dizeyi başarılı bir şekilde oluşturur. Görünüşe göre çok fazla PEG.js kullanıyor, ancak gerçek ayrıştırma gerçekleşmiyor.PEG.js

Örneğini bazı gerçek ayrıştırma yapmak için nasıl genişletebilirim?

start = obj 
obj = id:id children:(indent obj* outdent)? 
     { 
      var o = {}; 
      o[id] = children[1]; 
      return (children[1] ? o : id); 
     } 
id = [a-z] 
indent = '{' 
outdent = '}' 

blok belirginleştiren yerine parantez girintilemesini kullanın ve hala aynı çıktıyı almak için: Örnek olarak

, bunu nasıl dilbilgisi değiştirebilirim?

(aşağıdaki girişi ile bu dilbilgisi test etmek için http://pegjs.majda.cz/online kullanın: a{bcd{zyx{}}})

cevap

18

Ayrıştırıcı:

// do not use result cache, nor line and column tracking 

{ var indentStack = [], indent = ""; } 

start 
    = INDENT? l:line 
    { return l; } 

line 
    = SAMEDENT line:(!EOL c:. { return c; })+ EOL? 
    children:(INDENT c:line* DEDENT { return c; })? 
    { var o = {}; o[line] = children; return children ? o : line.join(""); } 

EOL 
    = "\r\n"/"\n"/"\r" 

SAMEDENT 
    = i:[ \t]* &{ return i.join("") === indent; } 

INDENT 
    = &(i:[ \t]+ &{ return i.length > indent.length; } 
     { indentStack.push(indent); indent = i.join(""); pos = offset; }) 

DEDENT 
    = { indent = indentStack.pop(); } 

Girdi:

a 
    b 
    c 
    d 
    z 
    y 
    x 

Çıkış:

{ 
    "a": [ 
     "b", 
     "c", 
     { 
     "d": [ 
      "z", 
      "y", 
      "x" 
     ] 
     } 
    ] 
} 

Boş bir nesneyi ayrıştıramıyor (son x), ancak çözülmesi kolay olmalı. Burada hile SAMEDENT kuralıdır, girinti seviyesi değişmediğinde başarılı olur. INDENT ve DEDENT, pos = offset numaralı metinle pozisyon değiştirmeden mevcut girinti seviyesini değiştirir.

+0

Bu anwser için gerçekten minnettarım. Bu yöntemle nasıl gelirsiniz lütfen? – jiyinyiyong

+0

Bu kopyayı doğrudan http://pegjs.majda.cz/online içine kopyalayıp yapıştırırsam derleme yapmaz. Ve biraz düzeltmeden sonra, bunun nasıl düzeltileceği açık değildir. – Clearly

+0

Sadece bunu test ettim, parçacık beklenen çıktıyı derler ve üretir. Orada ne tür hatalar yaptığınızdan emin değilim. – chakrit