8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 ANTLR 中解析连续行

Austin Wolff 2月前

26 0

我正在使用 C# 在 ANTLR 中编写一个解析器,该语言允许使用反斜杠将一行语法拆分为多行,以指示有后续行。这进一步

我正在用 C# 编写 ANTLR 解析器,该语言允许使用反斜杠将一行语法拆分为多行,以指示有后续行。这进一步复杂化了能够向任何代码行添加注释的能力。例如,我可以写类似

If ((A = B) AND \:Check A and B
    (C <> D))    :Check C and D
   Add 1 Count
End

即 If 语句分为两行,但两行都有注释。换行符可以位于语法行的任意位置,因此也可以这样写

If ((A = B) \:Check A and B
   AND (C <> D))    :Check C and D
   Add 1 Count
End

目前,我将反斜杠视为空格并忽略它。

WS : [ ()\\\t\r\n\f;]+ -> channel(HIDDEN);

我对布尔值的定义是

// Boolean Expressions
booleanCondition        : booleanExpression | '(' booleanExpression ')';
booleanExpression       : expression ('='|'<>'|'<'|'>') expression ((AND|OR|'&&'|'||') booleanExpression)*;

并且有一条评论

COMMENT                 : ':'+ ~[:=\r\n]*;

当我解析示例代码时,它几乎正确无误,但完全错过了第一条注释,并将第二条注释解析为 ErrorNode。有没有办法在 ANTLR 中做到这一点,而无需编写某种形式的预解析器?

任何建议都将不胜感激

帖子版权声明 1、本帖标题:在 ANTLR 中解析连续行
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Austin Wolff在本站《c#》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 这似乎有效:

    parse
     : if_stat EOF
     ;
    
    if_stat : 'If' expression command 'End';
    
    command
     : 'Add' expression ID
     ;
    
    expression
     : '(' expression ')'
     | expression ('=' | '<>' | '<' | '>') expression
     | expression ('AND' | 'OR' | '&&' | '||') expression
     | ID
     | NUMBER
     ;
    
    LINE_CONTINUATION : '\\' COMMENT? '\r'? '\n' -> channel(HIDDEN);
    COMMENT           : ':' ~[\r\n]+             -> channel(HIDDEN);
    WS                : [ \t\r\n\f]+             -> channel(HIDDEN);
    NUMBER            : [0-9]+;
    ID                : [a-zA-Z]+;
    

    解析如下:

    If ((A = B) AND \:Check A and B
        (C <> D))    :Check C and D
       Add 1 Count
    End
    

    如下:

    enter image description here

  • 我为全 C# 解决方案设置了一个解决方案过滤器,以减少编译时间。它在这方面效果很好。但是,几乎每次我从 git 获取最新版本时,它都会出现 \'

    我为全 C# 解决方案设置了一个解决方案过滤器,以减少编译时间。它在这方面效果很好。但是,几乎每次我从 git 获取最新版本时,它都会出现“解决方案过滤器中已加载/卸载其他项目。更新解决方案过滤器”警告。

    enter image description here

    什么都没变。出于好奇,我将 .slnf 文件复制到其他地方,然后在单击“更新解决方案过滤器”链接后比较了变化。什么都没变。仍然是同一个文件。

    这是一个错误吗?是不是我错误地使用了解决方案过滤器?或者我遗漏了一些明显的东西,比如设置?

返回
作者最近主题: