如何从JavaCC令牌的映像中删除双引号?

如何从JavaCC令牌的映像中删除双引号?,java,javacc,Java,Javacc,在JavaCC中,我接受以下条件下的字符串: < STRING : "\"" ("\\" ~[] | ~["\"","\\"] )* "\"" > 因此,图像最终会打印任何字符串,但带有另一组双引号 例如,我将输入:“这是一个句子。” 结果是:“这是一个句子。”“存储在字符串变量中 Java中是否有方法删除额外的双引号集,以便只打印:“这是一

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

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

因此,图像最终会打印任何字符串,但带有另一组双引号

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

结果是:“这是一个句子。”“存储在字符串变量中

Java中是否有方法删除额外的双引号集,以便只打印:“这是一个句子。”

str=str.substring(1,str.length()-1)
Javacc的替代方案


如果您的令牌匹配的输入是
“Hello”
,则令牌的
图像
字段的值将是一个7个字符的字符串,其第一个和最后一个字符都是双引号字符。它们实际上并不是多余的,它们是输入中的。假设您编写了

void foo() : {
    Token t ; }
{
    t = <STRING>
    { System.out.println( t.image ) ; }
}
这里是这样一个函数,基于我为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() ;
}
私有静态字符串unescape(字符串str){
StringBuffer结果=新的StringBuffer();

对于(int i=0,len=str.length();我不熟悉javacc,但这样一个简短的回答让我觉得你可能不是,只是回答了一些基本的java字符串操作。OP可能没有任何
str
来运行java代码,除非java中有一种方法可以删除额外的双引号集,以便它只打印:这是一个句子。"?但如果仅使用Javacc,这可能不是答案。当然,我们的洲际友谊不会因为这些琐碎的事情而受损!这对我很有用,谢谢!idk为什么ppl对此投了反对票。我清楚地问了如何使用Java,尽管我解释了我从Javacc获得令牌的方式。我同意。这是正确的回答呃。我认为问题更多的是,这个问题不清楚是Java问题还是JavaCC问题。不管怎样,上下票数现在至少是相等的。你怎么处理一个存储了额外引号的字符串?你还谈到打印-给我们一个你得到的答案。你在哪里打印字符串?
void foo() : {
    Token t ; }
{
    t = <STRING>
    { { String nakedImage = t.image.substring(1,t.image.length()-1) ;
        String unescapedImage = unescape( nakedImage ) ;
        System.out.println( unescapedImage ) ; } }
}
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() ;
}