R 语言:原始字符串的语法
R Language: Grammar for Raw Strings
我正在尝试在 R 语法中为原始字符串创建一个新规则。
引用R新闻:
There is a new syntax for specifying raw character constants similar
to the one used in C++: r"(...)" with ... any character sequence not
containing the sequence )". This makes it easier to write strings that
contain backslashes or both single and double quotes. For more details
see ?Quotes.
示例:
## A Windows path written as a raw string constant:
r"(c:\Program files\R)"
## More raw strings:
r"{()}"
r"(use both "double" and 'single' quotes)"
r"---(--)-)---"
但我不确定单独的语法文件是否足以实施该规则。
到目前为止,我尝试过类似语法的类似语法的旧建议的基础:
解析器:
| RAW_STRING_LITERAL #e42
词法分析器:
RAW_STRING_LITERAL
: ('R' | 'r') '"' ( '\' [btnfr"'\] | ~[\r\n"]|LETTER )* '"' ;
如有任何提示或建议,我们将不胜感激。
R ANTLR 语法:
https://github.com/antlr/grammars-v4/blob/master/r/R.g4
Bison 中的原始 R 语法:
要匹配 start- 和 end-delimiters,您必须使用目标特定代码。在 Java 中可能如下所示:
@lexer::members {
boolean closeDelimiterAhead() {
// Get the part between `r"` and `(`
String delimiter = getText().substring(2, getText().indexOf('('));
// Construct the end of the raw string
String stopFor = ")" + delimiter + "\"";
for (int n = 1; n <= stopFor.length(); n++) {
if (this._input.LA(n) != stopFor.charAt(n - 1)) {
// No end ahead yet
return false;
}
}
return true;
}
}
RAW_STRING
: [rR] '"' ~[(]* '(' ( {!closeDelimiterAhead()}? . )* ')' ~["]* '"'
;
将 r"---( )--" )----" )---"
标记为单个 RAW_STRING
。
编辑
并且由于分隔符只能由连字符(和 parenthesis/braces)组成,而不仅仅是任意字符,因此也应该这样做:
RAW_STRING
: [rR] '"' INNER_RAW_STRING '"'
;
fragment INNER_RAW_STRING
: '-' INNER_RAW_STRING '-'
| '(' .*? ')'
| '{' .*? '}'
| '[' .*? ']'
;
我正在尝试在 R 语法中为原始字符串创建一个新规则。
引用R新闻:
There is a new syntax for specifying raw character constants similar to the one used in C++: r"(...)" with ... any character sequence not containing the sequence )". This makes it easier to write strings that contain backslashes or both single and double quotes. For more details see ?Quotes.
示例:
## A Windows path written as a raw string constant:
r"(c:\Program files\R)"
## More raw strings:
r"{()}"
r"(use both "double" and 'single' quotes)"
r"---(--)-)---"
但我不确定单独的语法文件是否足以实施该规则。 到目前为止,我尝试过类似语法的类似语法的旧建议的基础:
解析器:
| RAW_STRING_LITERAL #e42
词法分析器:
RAW_STRING_LITERAL
: ('R' | 'r') '"' ( '\' [btnfr"'\] | ~[\r\n"]|LETTER )* '"' ;
如有任何提示或建议,我们将不胜感激。
R ANTLR 语法:
https://github.com/antlr/grammars-v4/blob/master/r/R.g4
Bison 中的原始 R 语法:
要匹配 start- 和 end-delimiters,您必须使用目标特定代码。在 Java 中可能如下所示:
@lexer::members {
boolean closeDelimiterAhead() {
// Get the part between `r"` and `(`
String delimiter = getText().substring(2, getText().indexOf('('));
// Construct the end of the raw string
String stopFor = ")" + delimiter + "\"";
for (int n = 1; n <= stopFor.length(); n++) {
if (this._input.LA(n) != stopFor.charAt(n - 1)) {
// No end ahead yet
return false;
}
}
return true;
}
}
RAW_STRING
: [rR] '"' ~[(]* '(' ( {!closeDelimiterAhead()}? . )* ')' ~["]* '"'
;
将 r"---( )--" )----" )---"
标记为单个 RAW_STRING
。
编辑
并且由于分隔符只能由连字符(和 parenthesis/braces)组成,而不仅仅是任意字符,因此也应该这样做:
RAW_STRING
: [rR] '"' INNER_RAW_STRING '"'
;
fragment INNER_RAW_STRING
: '-' INNER_RAW_STRING '-'
| '(' .*? ')'
| '{' .*? '}'
| '[' .*? ']'
;