我写了一个pegjs语法,它可以解析任何js/c风格的注释。然而,这并不是很有效,因为我只设法捕获了注释本身,而忽略了其他所有内容。我应该如何改变这个语法,使其只解析任何类型的输入中的注释?
语法:
Start
= Comment
Character
= .
Comment
= MultiLineComment
/ SingleLineComment
LineTerminator
= [\n\r\u2028\u2029]
MultiLineComment
= "/*" (!"*/" Character)* "*/"
MultiLineCommentNoLineTerminator
= "/*" (!("*/" / LineTerminator) Character)* "*/"
SingleLineComment
= "//" (!LineTerminator Character)*输入:
/**
* Trending Content
* Returns visible videos that have the largest view percentage increase over
* the time period.
*/
Other text here错误
Line 5, column 4: Expected end of input but "\n" found.发布于 2017-01-27 08:59:27
在考虑注释(单行或多行)之前,您需要重构以专门捕获行内容,如下所示:
lines = result:line* {
return result
}
line = WS* line:$( !'//' CHAR )* single_comment ( EOL / EOF ) { // single-comment line
return line.replace(/^\s+|\s+$/g,'')
}
/ WS* line:$( !'/*' CHAR )* multi_comment ( EOL / EOF ) { // mult-comment line
return line.replace(/^\s+|\s+$/g,'')
}
/ WS* line:$CHAR+ ( EOL / EOF ) { // non-blank line
return line.replace(/^\s+|\s+$/g,'')
}
/ WS* EOL { // blank line
return ''
}
single_comment = WS* '//' CHAR* WS*
multi_comment = WS* '/*' ( !'*/' ( CHAR / EOL ) )* '*/' WS*
CHAR = [^\n]
WS = [ \t]
EOF = !.
EOL = '\n'它在运行时:
no comment here
single line comment // single-comment HERE
test of multi line comment /*
multi-comment HERE
*/
last line返回:
[
"no comment here",
"",
"single line comment",
"",
"test of multi line comment",
"",
"last line"
]https://stackoverflow.com/questions/38529702
复制相似问题