Antlr R语言:原始字符串的语法

Antlr R语言:原始字符串的语法,antlr,antlr4,Antlr,Antlr4,我试图在R语法中为原始字符串创建一个新规则 新闻引述: 有一种新的语法用于指定原始字符常量 到C++中使用的一个:r“(…)”带。。。任何字符序列都不是 包含序列“”。这使得编写 包含反斜杠或单引号和双引号。有关详细信息,请参阅 看到了吗?引用 示例: ## A Windows path written as a raw string constant: r"(c:\Program files\R)" ## More raw strings: r"{(\1\2)}

我试图在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
Lexer:

RAW_STRING_LITERAL
        : ('R' | 'r') '"' ( '\\' [btnfr"'\\] | ~[\r\n"]|LETTER )* '"' ; 
如有任何提示或建议,我们将不胜感激

R ANTLR语法:

野牛的原始R语法:


要匹配开始和结束分隔符,您必须使用特定于目标的代码。在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()}? . )* ')' ~["]* '"'
 ;

要匹配开始分隔符和结束分隔符,您必须使用特定于目标的代码。在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()}? . )* ')' ~["]* '"'
 ;

你好,巴特。谢谢你的快速回答。我明天会试试。只有两个问题。你添加了附加空格。但是它是否用于原始字符串的何处?特定于目标的代码是否也可以在侦听器中外部化?@Marcel“但是它是否用于原始字符串的何处?”不,它只是用于我自己的测试目标特定的代码也可以在侦听器中外部化吗?”,不,不幸的是不可以。Hello Bart。到目前为止效果很好!谢谢你的帮助。还有一个问题。这个规则不区分上下文吗?似乎我不必声明“r”和“r”“'根据此解释,在规则的开头:分隔符是否总是固定(可能重复)字符,如
-
-
等?如果是这样的话,那么可能有一种方法可以在不使用谓词的情况下对其进行匹配(我相信,这就是您所要求的:一种不使用谓词的方式匹配标记):原始字符常量也可以使用与C++:r“(…)”中使用的语法类似的语法,使用。。。任何字符序列,但不能包含结束序列“)。分隔符对[]和{}也可以使用,R可以代替R。为了增加灵活性,可以在开始引号和开始分隔符之间放置许多破折号,只要结束分隔符和结束引号之间出现相同数量的破折号。你好,巴特。谢谢你的快速回答。我明天会尝试。只有两个问题。You添加了附加空格。但它是否用于原始字符串的何处?特定于目标的代码是否也可以在侦听器中外部化?@Marcel“但它是否用于原始字符串的何处?”不,它只是用于我自己的测试。特定于目标的代码是否也可以在侦听器中外部化?“,不,不幸的是没有。你好,巴特。到目前为止效果很好!谢谢你的帮助。还有一个问题。此规则是否不区分上下文?根据这一解释,我似乎不必在规则的开头声明“r”和“r”:分隔符是否总是一个固定的(可能重复的)字符,如
-
-
等?如果是这样的话,那么可能有一种方法可以在不使用谓词的情况下对其进行匹配(我相信,这就是您所要求的:一种不使用谓词的方式匹配标记):原始字符常量也可以使用与C++:r“(…)”中使用的语法类似的语法,使用。。。任何字符序列,但不能包含结束序列“)。分隔符对[]和{}也可以使用,并且可以使用R代替R。为了增加灵活性,可以在开始引号和开始分隔符之间放置多个破折号,只要结束分隔符和结束引号之间出现相同数量的破折号。