我正在尝试修改这个语法来解析Solidity注释。
我想获得两种类型的注释:多行注释,即“/*任何字符串*/”的形式,以及单行注释,即“//任何字符串NEWLINE”的形式。
我用以下代码修改了注释行:
comment
: '/*' (. | '@' | '\'' | '¯' | '┌' | '┐' | '│' | '└' | '┘' | '─' | '┬' | '├' | '▼' | '►')*? '*/';
LINE_COMMENT
: '//' ~[\r\n]*
;
lineComment
: LINE_COMMENT
;
第一个问题是我似乎必须使用 OR 手动插入几个特殊字符,例如“@”,因为通配符“.”好像不行。
第二个是我无法正确拦截注释行,例如:
/*//////////////////////////////////////////////////////////////
COMMENT
//////////////////////////////////////////////////////////////*/
因为解析器没有正确分析结束字符'*/'
如果我只是从现有语法中删除
-> channel(HIDDEN)
:
COMMENT
: '/*' .*? '*/';
LINE_COMMENT
: '//' ~[\r\n]*;
然后标记化:
// foo bar
/* @ mu foo @ */
/*//////////////////////////////////////////////////////////////
COMMENT
//////////////////////////////////////////////////////////////*/
它按预期工作(创建了 3 个代币):
3 tokens:
1 LINE_COMMENT '// foo bar'
2 COMMENT '/* @ mu foo @ */'
3 COMMENT '/*//////////////////////////////////////////////////////////////\n COMMENT\n//////////////////////////////////////////////////////////////*/'