如何解决R语言:原始字符串的语法 编辑
R新闻行情:
有一种新的语法,用于指定类似的原始字符常量 到C ++中使用的那个:r“(...)”带有...任何字符序列都不能 包含序列)“。这样可以更轻松地编写 包含反斜杠或单引号和双引号。更多细节 参见报价。
示例:
## A Windows path written as a raw string constant:
r"(c:\Program files\R)"
## More raw strings:
r"{(\1\2)}"
r"(use both "double" and 'single' quotes)"
r"---(\1--)-)---"
但是我不确定语法文件是否足以实现该规则。 直到现在,我还是从类似语法的较早建议中尝试了以下类似方法:
解析器:
| 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
野牛的原始R语法:
https://svn.r-project.org/R/trunk/src/main/gram.y
解决方法
要匹配开始和结束定界符,您将必须使用目标特定的代码。在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
。
编辑
并且由于分隔符只能由连字符(和括号/大括号)组成,而不能仅由任意字符组成,因此也应该这样做:
RAW_STRING
: [rR] '"' INNER_RAW_STRING '"'
;
fragment INNER_RAW_STRING
: '-' INNER_RAW_STRING '-'
| '(' .*? ')'
| '{' .*? '}'
| '[' .*? ']'
;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。