ANTLR 4中的词法分析器和解析器规则中“ \ n”的歧义引用

用户名

第一:这不是语法错误!我的语法文件没有任何错误!我想为我的程序编写C#语法。我已从CodePlex下载此语法:ANTLR C#4.0语法我没有找到用于ANTLR 4的更好的C#语法。此语法不支持对我的程序非常重要的文档注释。该语法会跳过所有注释,因此我删除了跳过文档注释的代码,并编写了用于文档注释的代码,但是我不知道怎么说,在“ \ n”之后必须为“ ///”。恐怕,词法分析器在识别出“ \ n”时会自动跳过词法符号,并且永远不会与此匹配:('\ n''///')?在我的解析器规则中有谁知道,如何解决这个问题?还是有人可以向我解释我的代码是否正确?

这是我的文档注释解析器规则:

//documentation comments
doc_comment :
'///' (  summary remarks?
        |remarks
        );
summary :
    '<summary' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* tag_body+ (('\n' '///')* comment_text ('\n' '///')*)* '</summary>';
remarks :
    '<remarks' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</remarks>';
tag_body :   '<c' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</c>'
            |'<code' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</code>'
            |'<example' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</example>'
            |'<exception' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</exception>'
            |'<include' 'file' '=' '\'' comment_text '\'' 'path' '=' '\'' comment_text ('[' '@name' '=' '"'identifier '"' ']')? '\'' '/' '>'
            |'<list' 'type' '=' ('"bullet"' | '"number"' | '"table"') '>' ('\n' '///')* listheader? listitem? '</list>' 
            |'<para' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</para>' 
            |'<param' 'name' '=' '"' identifier '"' '>' (('\n' '///')* comment_text ('\n' '///')*)* '</param>'
            |'<paramref' 'name' '=' '"' comment_text '"' '/' '>'
            |'<permission' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</permission>'
            |'<returns' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</returns>'
            |'<see' cref '/' '>'
            |'<seealso' cref '/' '>'
            |'<typeparam' 'name' '=' '"' comment_text '"' '>' (('\n' '///')* comment_text ('\n' '///')*)* '</typeparam>'
            |'<typeparamref' 'name' '=' '"' comment_text '"' '/' '>'
            |'<value' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</value>';
cref : 'cref' '=' '"' comment_text '"' ;
listheader : '<listheader>' ('<term>' (('\n' '///')* comment_text ('\n' '///')*)* '</term>')? ('<description>' (('\n' '///')* comment_text ('\n' '///')*)* '</description>')? '</listheader>';
listitem : '<listitem>' ('<term>' (('\n' '///')* comment_text ('\n' '///')*)* '</term>')? ('<description>' (('\n' '///')* comment_text ('\n' '///')*)* '</description>')? '</listitem>';

这是空白(WS)的词法分析器规则,comment_text的解析器规则和注释字符(ANY_CHARS)的词法分析器规则:

WS:
    (' '  |  '\r'  |  '\t'  |  '\n'  ) -> skip;
comment_text : ANY_CHARS;
fragment ANY_CHARS: (.)*;

感谢您的答复!

皮特

山姆·哈威尔

我确信从理论上讲可以与文件的其余部分同时解析XML文档注释,但这是维护的噩梦,尤其是对于词法分析器规则。例如,您将如何处理以下内容?

/// <see
///      cref="Something"
/// />

代替采取这种方法,您应该执行以下操作。

  1. 将所有文档注释标记移至其各自的通道。

    @members {
        public const int DocCommentsChannel = 2;
    }
    
    DOC_COMMENT : '///' ~[\r\n]* -> channel(DocCommentsChannel);
    LINE_COMMENT : '//' ~[\r\n]* -> channel(HIDDEN);
    
  2. 解析之后,编写代码以检查通道ITokenStream上所有令牌实例的,直到DocCommentsChannel导致某些项目的声明,然后将它们作为一组进行处理。使用单独的解析器。通过///从每行中删除前导字符并将所得的文本块作为根元素的主体(如)来创建注释的内存中XML表示,可以最轻松地执行此操作<Comment>{Your comment text here}</Comment>然后,您可以调用XDocument.Parse以加载评论,并根据需要从那里进行处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ANTLR4词法分析器无法解决语法顺序中的歧义

来自分类Dev

词法分析器和解析器的ANTLR令牌识别错误

来自分类Dev

ANTLR解析器/词法分析器中的可选前缀

来自分类Dev

Antlr4中的回溯词法分析器成员

来自分类Dev

ANTLR4-词法分析器规则中的多个代码块

来自分类Dev

使用ANTLR生成词法分析器/解析器作为流

来自分类Dev

antlr 生成词法分析器但不生成解析器

来自分类Dev

用终止条件定义Antlr词法分析器规则

来自分类Dev

ANTLR4词法分析器规则无法按预期工作

来自分类Dev

如何定义不匹配任何内容的ANTLR4词法分析器规则?

来自分类Dev

ANTLR4词法分析器规则无法按预期工作

来自分类Dev

Antlr4使用相同符号的不同词法分析器规则

来自分类Dev

ANTLR条件词法分析器

来自分类Dev

ANTLR4:词法分析器调试/跟踪

来自分类Dev

ANTLR4 RegEx词法分析器模式

来自分类Dev

如何将Antlr4生成的词法分析器/解析器集成到我的Java项目中

来自分类Dev

如何将Antlr4生成的词法分析器/解析器集成到我的Java项目中

来自分类Dev

ANTLR4:词法分析器在词法分析器模式下返回单个标记

来自分类Dev

如何编写引用字符的词法分析器规则?

来自分类Dev

ANTLR词法分析器-能否更喜欢较短的比赛?

来自分类Dev

ANTLR词法分析器,用于C样式注释

来自分类Dev

Antlr-多个词法分析器导入

来自分类Dev

ANTLR词法分析器,用于C样式注释

来自分类Dev

ANTLR:忽略解析器中的语句

来自分类Dev

ANTLR4解析器规则粒度

来自分类Dev

ANTLR4解析器规则冲突

来自分类Dev

基于ANTLR4的词法分析器在NetBeans上键入时失去语法重点

来自分类Dev

Antlr4 没有检测到 1 到 8 的整数,词法分析器问题

来自分类Dev

利用ANTLR 4的左递归歧义

Related 相关文章

  1. 1

    ANTLR4词法分析器无法解决语法顺序中的歧义

  2. 2

    词法分析器和解析器的ANTLR令牌识别错误

  3. 3

    ANTLR解析器/词法分析器中的可选前缀

  4. 4

    Antlr4中的回溯词法分析器成员

  5. 5

    ANTLR4-词法分析器规则中的多个代码块

  6. 6

    使用ANTLR生成词法分析器/解析器作为流

  7. 7

    antlr 生成词法分析器但不生成解析器

  8. 8

    用终止条件定义Antlr词法分析器规则

  9. 9

    ANTLR4词法分析器规则无法按预期工作

  10. 10

    如何定义不匹配任何内容的ANTLR4词法分析器规则?

  11. 11

    ANTLR4词法分析器规则无法按预期工作

  12. 12

    Antlr4使用相同符号的不同词法分析器规则

  13. 13

    ANTLR条件词法分析器

  14. 14

    ANTLR4:词法分析器调试/跟踪

  15. 15

    ANTLR4 RegEx词法分析器模式

  16. 16

    如何将Antlr4生成的词法分析器/解析器集成到我的Java项目中

  17. 17

    如何将Antlr4生成的词法分析器/解析器集成到我的Java项目中

  18. 18

    ANTLR4:词法分析器在词法分析器模式下返回单个标记

  19. 19

    如何编写引用字符的词法分析器规则?

  20. 20

    ANTLR词法分析器-能否更喜欢较短的比赛?

  21. 21

    ANTLR词法分析器,用于C样式注释

  22. 22

    Antlr-多个词法分析器导入

  23. 23

    ANTLR词法分析器,用于C样式注释

  24. 24

    ANTLR:忽略解析器中的语句

  25. 25

    ANTLR4解析器规则粒度

  26. 26

    ANTLR4解析器规则冲突

  27. 27

    基于ANTLR4的词法分析器在NetBeans上键入时失去语法重点

  28. 28

    Antlr4 没有检测到 1 到 8 的整数,词法分析器问题

  29. 29

    利用ANTLR 4的左递归歧义

热门标签

归档