使用Antlr语法解析Solidity注释

问题描述 投票:0回答:1

我正在尝试修改这个语法来解析Solidity注释。

我想获得两种类型的注释:多行注释,即“/*任何字符串*/”的形式,以及单行注释,即“//任何字符串NEWLINE”的形式。

我用以下代码修改了注释行:

comment
  : '/*' (. | '@' | '\'' | '¯' | '┌' | '┐' | '│' | '└' | '┘' | '─' | '┬' | '├' | '▼' | '►')*? '*/';

LINE_COMMENT
    : '//' ~[\r\n]*
    ;

lineComment
    : LINE_COMMENT
    ;

第一个问题是我似乎必须使用 OR 手动插入几个特殊字符,例如“@”,因为通配符“.”好像不行。

第二个是我无法正确拦截注释行,例如:

/*//////////////////////////////////////////////////////////////
                          COMMENT
//////////////////////////////////////////////////////////////*/

因为解析器没有正确分析结束字符'*/'

parsing solidity antlr grammar
1个回答
0
投票

如果我只是从现有语法中删除

-> 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//////////////////////////////////////////////////////////////*/'

© www.soinside.com 2019 - 2024. All rights reserved.