0

我正在定义Move IR的语法。该语言的测试套件包括各种注释以启用测试。我需要特别对待这种形式的评论:

//! new-transaction
// check: "Keep(ABORTED { code: 123,"

该文件是一个示例algorithm_operators_u8.mvir

到目前为止,我通过禁止普通的单行注释来实现这一点。

module MOVE-ANNOTATION-SYNTAX-CONCRETE
    imports INT-SYNTAX
    syntax #Layout ::= r"([\\ \\n\\r\\t])"       // Whitespace                                                          
    syntax Annotation ::= "//!" "new-transaction" [klabel(NewTransaction), symbol]                                      
    syntax Check ::= "//" "check:" "\"Keep(ABORTED { code:" Int ",\"" [klabel(CheckCode), symbol]                                                                                                                                         
endmodule                                                                                                               
                                                                                                                  
module MOVE-ANNOTATION-SYNTAX-ABSTRACT
    imports INT-SYNTAX
    syntax Annotation ::= "#NewTransaction" [klabel(NewTransaction), symbol]                                            
    syntax Check ::= #CheckCode(Int)        [klabel(CheckCode), symbol]                                                 
endmodule                   

我也希望能够使用普通评论。作为第一步,我能够更改布局以仅在以!using开头时才允许提交r"(\\/\\/[^!][^\\n\\r]*)"

我想排除所有以评论开头//!或评论开头// check:的评论。什么是实现这一点的好方法?在哪里可以找到 K 使用的正则表达式语言的文档?

4

1 回答 1

1

K 使用 flex 作为它的扫描器,因此也用于它的正则表达式语言。因此,您可以在此处找到有关其正则表达式语言的文档。

您需要一个表示注释不能以!or开头的正则表达式check:,但 flex 不支持负前瞻或非模式,因此您将不得不详尽列举不以这些字符序列开头的所有注释情况. 这有点乏味,可悲的是。

作为参考,这里是一个从 C 语法中提取的(简化的)正则表达式,它表示所有不以STDC. 它应该让您了解如何进行:

#pragma([:space:]*)([^S].*|S|S[^T].*|ST|ST[^D].*|STD|STD[^C].*|STDC[_a-zA-Z0-9].*)?$
于 2021-06-08T15:05:13.297 回答