定义 "anything except" 正则表达式模式以在 Rascal 中进行解析

Defining an "anything except" regex pattern for parsing in Rascal

Lex,一种 Unix 词法分析器工具,允许您按如下方式定义此模式:[^\a]

在此示例中,它指定除字符 a 之外的任何内容。我们正试图在 rascal 中做同样的事情,但无法弄清楚如何在我们的迷你解析器中指定它。

import String;
import util::FileSystem;

lexical CommentStart = ^"/*";

lexical CommentEnd = "*/";

lexical LineComment = ^"//";

lexical Any = ????;

syntax Badies = CommentStart | CommentEnd | LineComment | Any;


/* Parses a single string */
int parseLine (str line) {  
    pt = parse(#Badies, line);
    visit (pt) {
        case CommentStart:
            return 1;
        case CommentEnd:
            return 2;
        case LineComment:
            return 3;
    }
    return 4;
}

也许我们的问题处理有误,但如果有人可以帮助定义我们的 "anything except" 正则表达式,我们将不胜感激。

lexical Any = ![]

!运算符否定字符 class。请注意,出于实际目的,0 EOF 字符不包含在否定中。

在某些情况下可能适用的另一种可能性是使用字符范围,然后减去不需要的字符。例如,JSON 字符串中的合法字符是除 ASCII 控制字符、双引号和反斜杠或转义字符序列之外的任何 Unicode 字符。您可以将其表达为:

lexical JsonChar
    = [\u0020-\U10FFFF] - [\"\]
    | [\] [\" \ / b f n r t]
    | [\] [u] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F]
    ;

(注意 6 位 Unicode 转码的大写字母 U。)

或者,等同于(我希望)![\a00-\a19 \" \] | ...。甚至 ![] - [\a00-\a19 \" \] | ....

例如:

rascal>parse(#JsonChar, "\U01f41d")
JsonChar: (JsonChar) ``

(是的,Unicode 现在 几乎 带有一个 Rascal-logo 表情符号!)

如果合法 Unicode 字符的范围每次都扩展(或者如果 Rascal 自己扩展),可能会有不同,但这可能主要取决于您的大脑。 (JSON 标准在 RFC ABNF 表示法中将其写为“%x20-21 / %x23-5B / %x5D-10FFFF”。)