2014-10-24 4 views
7

Реализация парсера, основанного на peg.js, я заставляю добавить код для обработки комментариев в стиле c/*, как это * /.PEG.js - как разобрать комментарии в стиле c?

Мне нужно найти маркер конца, не съев его.

это не работает:

multi = '/*' .* '*/' 

Послание:

line: 14 
Expected "*/" or any character but end of input found. 

Я понимаю, почему это не работает, но, к сожалению, я понятия не имею, как сделать разбора комментариев функциональны.

Вот код до сих пор:

start = item* 

item = comment/content_line 

content_line = _ p:content _ {return ['CONTENT',p]} 

content = 'some'/'legal'/'values' 

comment = _ p:(single/multi) {return ['COMMENT',p]} 

single = '//' p:([^\n]*) {return p.join('')} 

multi = 'TODO' 


_ = [ \t\r\n]* {return null} 

и некоторые примеры ввода:

// line comment, no problems here 

/* 
    how to parse this ?? 
*/ 

values 

// another comment 

some legal 

ответ

11

Используйте предикат, который смотрит вперед и делает, что нет "*/" вперед в потоке символов перед сопоставлением символов :

comment 
= "/*" (!"*/" .)* "*/" 

(!"*/" .) часть c следует читать следующим образом: , когда нет '*/' впереди, в соответствии с любым персонажем.

Это будет для них матч комментарии, как это успешно: /* ... **/

+0

Работа! Большое спасибо. Я отправлю полный код. – Gisela

5

полный код:

Parser:

start = item* 

item = comment/content_line 

content_line = _ p:content _ {return ['CONTENT',p]} 

content = 'all'/'legal'/'values'/'Thanks!' 

comment = _ p:(single/multi) {return ['COMMENT',p]} 

single = '//' p:([^\n]*) {return p.join('')} 

multi = "/*" inner:(!"*/" i:. {return i})* "*/" {return inner.join('')} 

_ = [ \t\r\n]* {return null} 

Образец:

all 

// a comment 

values 

// another comment 

legal 

/*12 
345 /* 
*/ 

Thanks! 

Результат:

[ 
    ["CONTENT","all"], 
    ["COMMENT"," a comment"], 
    ["CONTENT","values"], 
    ["COMMENT"," another comment"], 
    ["CONTENT","legal"], 
    ["COMMENT","12\n345 /* \n"], 
    ["CONTENT","Thanks!"] 
] 

 Смежные вопросы

  • Нет связанных вопросов^_^