定义 "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
”。)
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
”。)