定义一个;任何东西,除了;Rascal中用于解析的正则表达式模式

定义一个;任何东西,除了;Rascal中用于解析的正则表达式模式,rascal,Rascal,Lex是一种Unix lexer工具,允许您按如下方式定义此模式:[^\a] 在本例中,它指定除字符a之外的任何内容。我们正在尝试在rascal中执行同样的操作,但无法在我们的迷你解析器中指定它 import String; import util::FileSystem; lexical CommentStart = ^"/*"; lexical CommentEnd = "*/"; lexical LineComment = ^"//"; lexical Any = ????; s

Lex是一种Unix lexer工具,允许您按如下方式定义此模式:
[^\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;
}
也许我们的问题处理得不对,但如果有人能帮助定义我们的“除此之外的任何东西”正则表达式,我们将不胜感激

lexical Any = ![]

这个!运算符对字符类求反。请注意,出于实际目的,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)`