Antlr4:如何匹配多行注释中的行尾?

时间:2016-10-10 12:20:01

标签: antlr antlr4

我必须创建一个程序来计算忽略注释内部代码的代码行。我是一个与Antlr一起工作的新手,在经过多次努力之后,最接近解决的是这个错误的语法:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {        
    return CGSize(width: collectionView.frame.width / 2, height: 100)
}

如果我尝试使用grammar Comments; comment : startc content endc; startc : '/*'; endc : '*/'; content : newline | contenttext; contenttext : CONTENTCHARS+; newline : '\r\n'; CONTENTCHARS : ~'*' '/' | ~'/' . ; WS : [ \r\t]+ -> skip; ,解析器会识别出这一点,这是错误的:

enter image description here

为了计算行数,解析器需要检测多行注释内外的换行符。我认为我的问题是,我不知道怎么说"匹配/*hello\r\nworld*//* 中的所有内容,除了 */

拜托,你能指出我正确的方向吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

解决方案

让我们简化你的语法!在语法中,我们将忽略词法分析器阶段的空白字符和注释(同时不需要的换行符!)。例如,COMMENT部分将匹配一行注释或多行注释,只是跳过它们!

接下来,我们将介绍counter变量,用于计算仅在NEWLINE语法规则中使用的content令牌(因为COMMENT令牌被跳过,因此{{1} }令牌!)。

每当我们遇到NEWLINE令牌时,我们会增加NEWLINE变量。

counter