实现一个基于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
解决方法
使用前瞻的谓词并确保在匹配字符之前字符流中没有“* /”:
comment = "/*" (!"*/" .)* "*/"
(!“* /”.)部分可以如下读取:当前面没有’* /’时,匹配任何字符.
这将成功匹配这样的评论:/ * … ** /