【问题标题】:How do you remove double quotes from the image of a JavaCC token?如何从 JavaCC 令牌的图像中删除双引号?
【发布时间】:2020-10-06 19:10:47
【问题描述】:

在 JavaCC 中,我接受以下条件的字符串:

   < STRING : "\"" ("\\" ~[] | ~["\"","\\"] )* "\"" > 

所以图像最终会打印出任何字符串,但带有另一组双引号。

例如,我会输入:“这是一个句子。”

并且值将导致:“”这是一个句子。“”存储在一个字符串变量中。

有没有办法在 Java 中删除多余的双引号,使其只打印:“This is a sentence.”

【问题讨论】:

  • 如何处理存储了额外引号的字符串?您还谈到了印刷 - 给我们minimal reproducible example 了解您所得到的。
  • 你在哪里打印字符串?

标签: java javacc


【解决方案1】:

如果您的令牌匹配的输入是"Hello",那么令牌的image 字段的值将是一个7 个字符的字符串,其首尾字符是双引号字符。它们并不是真正额外的,它们是输入中的。说你写

void foo() : {
    Token t ; }
{
    t = <STRING>
    { System.out.println( t.image ) ; }
}

这将打印 7 个字符,然后是一个换行符。

现在,如果您不想要这些字符,那么,@Bryan 的回答会做到。

void foo() : {
    Token t ; }
{
    t = <STRING>
    { { String nakedImage = t.image.substring(1,t.image.length()-1) ;
        System.out.println( nakedImage ) ; } }
}

需要注意的是没有引号被删除。 String Java 中的对象是不可变的,这意味着它们无法更改。真正发生的是创建了一个新的String 对象,并将对它的引用分配给nakedImage 变量。 t.image 引用的 String 对象保持不变。

现在你仍然有处理反斜杠的问题。如果输入是“Hello\tWorld”,则t.image 的长度为 14 个字符,nakedImage 的长度为 12 个字符。我此时要做的是通过一个函数运行字符串,构建一个新字符串,该字符串具有单个字符,其中 nakedImage 具有转义序列。因此,本例中该函数的结果将是 11 个字符长。

void foo() : {
    Token t ; }
{
    t = <STRING>
    { { String nakedImage = t.image.substring(1,t.image.length()-1) ;
        String unescapedImage = unescape( nakedImage ) ;
        System.out.println( unescapedImage ) ; } }
}

这是一个基于我为 Java 编译器编写的函数。

private static String unescape( String str ) {
    StringBuffer result = new StringBuffer() ;
    for( int i=0, len = str.length() ; i<len ; ) {
        char ch = str.charAt(i) ;

        // Set ch and increment i ;
        if( ch == '\\' )  {
            ch = str.charAt(i+1) ;
            switch( ch ) {
                case 'b' : ch = '\b' ; i += 2 ; break ;
                case 't' : ch = '\t' ; i += 2 ; break ;
                case 'n' : ch = '\n' ; i += 2 ; break ;
                case 'f' : ch = '\f' ; i += 2 ; break ;
                case 'r' : ch = '\r' ; i += 2 ; break ;
                case '"' : case '\'' : case '\\' : i+= 2 ; break ;
                default: 
                    /*TODO Deal with errors. */ } }
        else {
            i += 1 ; }
        result.append( ch ) ; }
    return result.toString() ;
}

【讨论】:

    【解决方案2】:
    str = str.substring(1,str.length()-1)
    

    替代 Javacc

    Parsing Strings with JavaCC

    【讨论】:

    • 我对 javacc 不熟悉,但如此简短的回答让我认为您可能也不熟悉,只是在回答一些基本的 java 字符串操作。 OP 可能没有任何 str 来运行 java 代码
    • 有没有办法在 Java 中删除多余的双引号集,使其只打印:“This is a sentence.”?但是是的,如果仅使用 Javacc,这可能不是答案。
    • 当然,我们的洲际友谊不会受到这种小事的影响!
    • 这对我有用,谢谢!并且知道为什么 ppl 否决了这一点。尽管我在解释从 JavaCC 获取该令牌的方式,但我清楚地询问了如何在 Java 中执行此操作。
    • 我同意。这是正确的答案。我认为问题更多的是问题不清楚是Java问题还是JavaCC问题。无论如何,现在赞成票和反对票至少是相等的。
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多