微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R语言:原始字符串的语法 编辑

如何解决R语言:原始字符串的语法 编辑

我正在尝试在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 举报,一经查实,本站将立刻删除。