【问题标题】:How to exclude character " in a token JavaCC如何在令牌 JavaCC 中排除字符“
【发布时间】:2015-05-16 19:35:19
【问题描述】:

您好,我正在使用 JavaCC,我正在编写一个将一个字符串放在“”之间的令牌。背景:

void literalString(): {} { """ (characteresString())? """ }
void characteresString(): {} { <characterString> | characteresString() <characterString> }

所以我做了这个标记来放置一个字符串:

TOKEN : {<characterString : ~["\", "] >}

问题是我不知道如何排除标记中的 " 符号,如果我输入 """ 它会给我错误,如果我再次输入一个 " 错误。

提前谢谢你

【问题讨论】:

    标签: bnf javacc


    【解决方案1】:

    代替

    void literalString(): {} { """ (characteresString())? """ }
    

    使用令牌定义

    TOKEN : { <STRING : "\"" (<CHAR>)* "\"" >
            | <#CHAR : ~["\""] > // Any character that is not "
    }
    

    现在这将一个字符串定义为",后跟零个或多个不是"s 的字符,然后是另一个"

    但是有些语言有进一步的限制,比如只允许一定范围内的字符。例如,如果只有可打印的 ascii 字符不包括 "s 在允许的情况下,那么您将使用

    TOKEN : { <STRING : "\"" (<CHAR>)* "\"" >
            | <#CHAR: [" ","!","#"-"~"]> // Printable ASCII characters excluding "
    }
    

    但是,假设您想允许 " 字符在 \ 之前,并且您想禁止 \ 字符,除非它们后面跟着 " 或另一个 \ 或 @987654333 @。然后你可以使用

    TOKEN : { <STRING : "\"" (<CHAR> | <ESCAPESEQ>)* "\"" >
            | <#CHAR: [" ","!","#"-"[","]"-"~"] > // Printable ASCII characters excluding \ and "
            | <#ESCAPESEQ: "\\" ["\"","\\","n"] > // 2-character sequences \\, \", and \n
    }
    

    【讨论】:

    • 感谢您的回复,这正是我所要求的。现在我所有的疑虑都清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    相关资源
    最近更新 更多