【问题标题】:R Language: Grammar for Raw StringsR 语言:原始字符串的语法
【发布时间】:2020-11-02 15:18:58
【问题描述】:

我正在尝试在 R 语法中为原始字符串创建一个新规则。

引用 R 新闻:

有一种用于指定原始字符常量的新语法,类似于 到 C++ 中使用的那个: r"(...)" with ... 任何字符序列不是 包含序列)”。这使得编写字符串变得更容易 包含反斜杠或单引号和双引号。更多细节 见?行情。

例子:

## 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

Bison 中的原始 R 语法:

https://svn.r-project.org/R/trunk/src/main/gram.y

【问题讨论】:

    标签: antlr antlr4


    【解决方案1】:

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

    【讨论】:

    • 你好巴特。感谢您的快速答复。我明天试试。就两个问题。您添加了额外的空间。但它是否用于原始字符串?目标特定代码是否也可以在侦听器中外部化?
    • @Marcel “但它是否用于原始字符串的任何地方?”不,这只是为了我自己的测试。 “目标特定代码也可以在侦听器中外部化吗?”,不,很遗憾。
    • 你好巴特。到目前为止工作正常!谢谢你的帮助。还有一个问题。这条规则不是上下文敏感的吗?看来我不用按照这个解释在规则开头声明'r"'和'R"'了:stackoverflow.com/questions/5126779/…
    • 分隔符是否总是固定的(可能重复的)字符,例如----- 等?如果是这种情况,那么可能有一种方法可以在没有谓词的情况下匹配它(我相信这是你要问的:一种在没有谓词的情况下匹配令牌的方法)
    • 来自文档:原始字符常量也可以使用类似于 C++ 中使用的语法获得:r"(...)" with ... any character sequence,除了它不能包含结束序列 )"。也可以使用分隔符对 [] 和 {},并且可以使用 R 代替 r。为了增加灵活性,可以在开始引号和开始分隔符之间放置多个破折号,只要在结束分隔符和结束引号之间出现相同数量的破折号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多