【问题标题】:Parsing Strings with JavaCC使用 JavaCC 解析字符串
【发布时间】:2012-08-06 09:10:07
【问题描述】:

我正在尝试一种使用 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"

在我的语法中有效。

【问题讨论】:

  • 您应该接受 DerMike 的回答 - 它似乎非常完美。

标签: string parsing token javacc


【解决方案1】:

当传递第一个" 时,您的解析器希望进入一个字符串状态并将其留在下一个(奖励:未引用)"

喜欢:

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);
      }
    }
  }
}

HTH。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-10-14
    • 2011-07-14
    • 2020-04-11
    • 2021-07-25
    相关资源
    最近更新 更多