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