Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 用JavaCC解析字符串_String_Parsing_Token_Javacc - Fatal编程技术网

String 用JavaCC解析字符串

String 用JavaCC解析字符串,string,parsing,token,javacc,String,Parsing,Token,Javacc,我正试图想出一种使用JavaCC解析字符串的好方法,而不会错误地将其与另一个令牌匹配。这些字符串应该能够有空格、字母和数字 我的标识符和数字令牌如下所示: <IDENTIFIER: (["a"-"z", "A"-"Z"])+> <NUMBER: (["0"-"9"])+> 在我的语法中有效。当传递第一个“时,您的解析器希望进入字符串状态,并在下一个时将其保留(附加:无引号)” 比如: 令牌: { } 代币: { 你应该接受德米克的答案——它似乎非常完美。 <STR

我正试图想出一种使用JavaCC解析字符串的好方法,而不会错误地将其与另一个令牌匹配。这些字符串应该能够有空格、字母和数字

我的标识符和数字令牌如下所示:

<IDENTIFIER: (["a"-"z", "A"-"Z"])+>
<NUMBER: (["0"-"9"])+>

在我的语法中有效。

当传递第一个
时,您的解析器希望进入字符串状态,并在下一个
时将其保留(附加:无引号)

比如:

令牌:
{
}
代币:
{

你应该接受德米克的答案——它似乎非常完美。
<STRING: "\"" (<IDENTIFIER> | <NUMBERS> | " ")+ "\"">
variable=<INDENTIFIER> <ASSIGN> <QUOTE> message=<IDENTIFIER> <QUOTE>
{File.saveVariable(variable.image, message.image);}
" hello", "hello ", " hello " and "\nhello", "hello\n", "\nhello\n"
TOKEN:
{
  <QUOTE:"\""> : STRING_STATE
}

<STRING_STATE> MORE:
{
  "\\" : ESC_STATE
}

<STRING_STATE> TOKEN:
{
  <ENDQUOTE:<QUOTE>> : DEFAULT
| <CHAR:~["\"","\\"]>
}

<ESC_STATE> TOKEN:
{
  <CNTRL_ESC:["\"","\\","/","b","f","n","r","t"]> : STRING_STATE
}
/**
 * Match a quoted string.
 */
String string() :
{
  StringBuilder builder = new StringBuilder();
}
{
  <QUOTE> ( getChar(builder) )* <ENDQUOTE>
  {
    return builder.toString();
  }
}

/**
 * Match char inside quoted string.
 */
void getChar(StringBuilder builder):
{
  Token t;
}
{
  ( t = <CHAR> | t = <CNTRL_ESC> )
  {
    if (t.image.length() < 2)
    {
      // CHAR
      builder.append(t.image.charAt(0));
    }
    else if (t.image.length() < 6)
    {
      // ESC
      char c = t.image.charAt(1);
      switch (c)
      {
        case 'b': builder.append((char) 8); break;
        case 'f': builder.append((char) 12); break;
        case 'n': builder.append((char) 10); break;
        case 'r': builder.append((char) 13); break;
        case 't': builder.append((char) 9); break;
        default: builder.append(c);
      }
    }
  }
}