Посвятите производство с Javacc

Я пытаюсь написать грамматику javacc для анализа файла, содержащего такие выражения, как:

"key_1" = "my value";
"key_2" = "value";

По сути, я хочу соответствовать <KEY> "=" <VALUE> ";" где:

  • <KEY> соответствует регулярному выражению \"[a-zA-Z][a-zA-Z0-9_\-\.]*\" (например, совпадения "key1", "my_key1", "my-key1", "my.key1" но не будет соответствовать "0key")
  • <VALUE> любая строка, заключенная в двойные кавычки и допускающая экранированные кавычки (например, совпадения "Hello", "Hi there", "escaped \" quote")

Пока что у меня что-то работает, но это не помогает, когда = соответствует определению для <KEY> маркер. Например, он разбирает "key_1" = "my value"; хорошо, потому что "my value" не совпадает <KEY>, но он не может разобрать "key_2" = "value"; так как "value" Матчи <KEY>,

Конкретно ошибка, которую я получаю при попытке разобрать "key" = "value"; является:

Exception in thread "main" ParseException: Encountered " <KEY> "\"value\" "" at line 1, column 12.
Was expecting:
    <VALUE> ...

Это моя грамматика javacc в файле с именем TestParser.jj:

options {
  STATIC=false;
}

PARSER_BEGIN(TestParser)

public class TestParser {
  public static void main(String[] args) throws Exception {
    final TestParser parser = new TestParser(new java.io.FileReader(args[0]));
    parser.program();
  }
}

PARSER_END(TestParser)

SKIP : {
    " "
  | "\t"
  | "\n"
  | "\r"
}

TOKEN : {
    < KEY: "\"" (["a"-"z"]|["A"-"Z"]) (["a"-"z"]|["A"-"Z"]|["0"-"9"]|"_"|"-"|".")+ "\"" >
  | < VALUE: "\"" ("\\" ~[]| ~["\"","\\"])* "\"" >
}

void program() : {}
{
    (assignment())* <EOF>
}

void assignment(): {}
{
    <KEY> "=" <VALUE> ";"
}

Как я могу указать это один раз <KEY> "=" следующий действительный токен виден только <VALUE>? Ранее я использовал TatSu, у которого есть выражение "вырезать" специально для такого рода случаев, но я не могу найти никакого эквивалента в javacc.

0 ответов

Другие вопросы по тегам