2014-10-12 2 views
0

Я пытаюсь разобрать категории файл с PEG.jsКак группировать непустых строк с PEG.js

Как я группировать категории (набор непустых строк, за которым следует пустая строка)

stopwords:fr:aux,au,de,le,du,la,a,et,avec 

synonyms:en:flavoured, flavored 

synonyms:en:sorbets, sherbets 

en:Artisan products 
fr:Produits artisanaux 

< en:Artisan products 
fr:Gressins artisanaux 

en:Baby foods 
fr:Aliments pour bébé, aliment pour bébé, alimentation pour bébé, aliment bébé, alimentation bébé, aliments bébé 

< en:Baby foods 
fr:Céréales pour bébé, céréales bébé 

< en:Whisky 
fr:Whisky écossais 
es:Whiskies escoceses 
wikipediacategory:Q8718387 

на данный момент я могу разобрать построчно с этим кодом:

start = stopwords* synonyms* category+ 

language_and_words = l:[^:]+ ":" w:[^\n]+ {return {language: l.join(''), words: w.join('')};} 

stopwords = "stopwords:" w:language_and_words "\n"+ {return {stopwords: w};} 

synonyms = "synonyms:" w:language_and_words "\n"+ {return {synonyms: w};} 

category_line = "< "? w:language_and_words "\n"+ {return w;} 

category = c:category_line+ {return c;} 

я получил:

{ 
    "language": "en", 
    "words": "Artisan products" 
}, 
{ 
    "language": "fr", 
    "words": "Produits artisanaux" 
} 

, но я хочу (для каждой группы):

{ 
    { 
     "language": "en", 
     "words": "Artisan products" 
    }, 
    { 
     "language": "fr", 
     "words": "Produits artisanaux" 
    } 
} 

Я тоже попробовал, но это не группа, и я получил \ п в начале некоторых строк.

category_line = "< "? w:language_and_words "\n" {return w;} 

category = c:category_line+ "\n" {return c;} 

ответ

0

Я нашел частичное решение:

start = category+ 

word = c:[^,\n]+ {return c.join('');} 

words = w:word [,]? {return w.trim();} 

parent = p:"< "? {return (p !== null);} 

line = p:parent w:words+ "\n" {return {parent: p, words: w};} 

category = l:line+ "\n"? {return l;} 

Я могу разобрать это ...

< fr:a,b 
fr:aa,bb 

en:d,e,f 
fr:dd,ee, ffff 

и получить сгруппированных:

[ 
    [ {...}, {...} ], 
    [ {...}, {...} ] 
] 

Но есть проблема с «lang:» в начале каждой категории, если я попытаюсь разобрать e "lang:" мои категории не сгруппированы ...

0

Я считаю полезным разбить итеративный анализ (разложение проблемы, старая школа à la Wirth). Вот частичное решение, которое я думаю, что получает вас в правильном направлении (я не разобрать Line элементов категорий.

start = 
    stopwords 
    synonyms 
    category+ 

category "category" 
    = category:(Line)+ categorySeparator { return category } 

stopwords "stopwords" 
    = stopwordLine* 

stopwordLine "stopword line" 
    = stopwordLine:StopWordMatch EndOfLine* { return stopwordLine } 

StopWordMatch 
    = "stopwords:" match:Text { return match } 

synonyms "stopwords" 
    = synonymLine* 

synonymLine "stopword line" 
    = synonymLine:SynonymMatch EndOfLine* { return synonymLine } 

SynonymMatch 
    = "synonyms:" match:Text { return match } 

Line "line" 
    = line:Text [\n] { return line } 

Text "text" 
    = [^\n]+ { return text() } 

EndOfLine "(end of line)" 
    = '\n' 

EndOfFile 
    = !. { return "EOF"; } 

categorySeparator "separator" 
    = EndOfLine EndOfLine*/EndOfLine? EndOfFile 

Моего использование смешанного случая является произвольным и не очень стильно. Там также способ сохранить решения онлайн: http://peg.arcanis.fr/2WQ7CZ/