【发布时间】:2011-09-23 09:05:24
【问题描述】:
我正在尝试解析 C++/Java 样式的源文件,并希望将 cmets、字符串文字和空格隔离为标记。
对于空格和 cmets,通常建议的解决方案是(使用 ANTLR 语法):
// WS comments*****************************
WS: (' '|'\n'| '\r'|'\t'|'\f' )+ {$channel=HIDDEN;};
ML_COMMENT: '/*' (options {greedy=false;}: .)* '*/' {$channel=HIDDEN;};
SL_COMMENT: '//' (options {greedy=false;}: .)* '\r'? '\n' {$channel=HIDDEN;};
但是,问题是我的源文件也包含字符串文字,例如
printf(" /* something looks like comment and whitespace \n");
printf(" something looks like comment and whitespace */ \n");
"" 中的整个内容应该被视为单个标记,但我的 ANTLR 词法分析器规则显然会将它们视为 ML_COMMENT 标记:
/* something looks like comment and whitespace \n");
printf(" something looks like comment and whitespace */
但是我不能创建另一个词法分析器规则来将标记定义为一对 " 中的东西(假设 \" 转义序列被正确处理),因为这将被错误地视为字符串标记:
/* comment...."comment that looks */ /*like a string literal"...more comment */
简而言之,2 对 /**/ 和 "" 会相互干扰,因为每一对都可以包含另一对的开头作为其有效内容。那么我们应该如何定义一个词法分析器来处理这两种情况呢?
【问题讨论】:
标签: parsing antlr grammar lexer