Antlr4: официальный парсер MySQL всегда показывает & ldquo; нет жизнеспособной альтернативы на входе & rdquo; [Дубликат]

Посмотрите пример в здесь , у Стивена есть ясный ответ для вас:

Так вот что происходит, начиная с метода верхнего уровня (Button1_Click for UI / MyController.Get для ASP.NET):

  1. Метод верхнего уровня вызывает GetJsonAsync (в контексте UI / ASP.NET).
  2. GetJsonAsync запускает REST запрос, вызвав HttpClient.GetStringAsync (все еще в контексте).
  3. GetStringAsync возвращает незавершенную задачу, указывая, что запрос REST не завершен.
  4. GetJsonAsync ожидает задачу, возвращенную GetStringAsync. Контекст захвачен и будет использоваться для продолжения использования метода GetJsonAsync позже. GetJsonAsync возвращает незавершенную задачу, указывая, что метод GetJsonAsync не завершен.
  5. Метод верхнего уровня синхронно блокирует задачу, возвращенную GetJsonAsync. Это блокирует контекстный поток.
  6. ... В конце концов, запрос REST завершится. Это завершает задачу, которая была возвращена GetStringAsync.
  7. Продолжение для GetJsonAsync теперь готово к запуску и ожидает, что контекст будет доступен, чтобы он мог выполняться в контексте.
  8. Тупик. Метод верхнего уровня блокирует поток контекста, ожидая завершения GetJsonAsync, и GetJsonAsync ожидает, что контекст будет бесплатным, чтобы он мог завершить. Для примера пользовательского интерфейса «контекст» представляет собой контекст пользовательского интерфейса; для примера ASP.NET «контекст» представляет собой контекст запроса ASP.NET.
  9. Еще одна ссылка, которую вы должны прочитать:

    Ожидание и пользовательский интерфейс, тупики! О, мой!

1
задан KCK 11 April 2018 в 08:07
поделиться

1 ответ

Я в основном хочу «получить» все различные компоненты запроса, такие как выбранные столбцы списка, условия, подзапросы, имена таблиц и т. д.

tree содержит все данные: ParseTree tree = mySqlParser.dmlStatement();

строка 1:11 нет жизнеспособной альтернативы на входе '_'

Если вы посмотрите на lexer rules:

SELECT:                              'SELECT';

ID:                                  ID_LITERAL;

fragment ID_LITERAL:                 [A-Z_$0-9]*?[A-Z_$]+?[A-Z_$0-9]*;

кажется, что ключевые слова и идентификаторы не могут содержать строчные буквы.

Если вы запустите его так:

String sql = "SELECT CUST_NAME FROM CUSTOMERS WHERE CUST_NAME LIKE 'Kash%'";

MySqlLexer lexer = new MySqlLexer(CharStreams.fromString(sql));
MySqlParser parser = new MySqlParser(new CommonTokenStream(lexer));
ParseTree root = parser.dmlStatement();

System.out.println(root.toStringTree(parser));

, вы см. следующий вывод (для облегчения чтения):

(dmlStatement 
  (selectStatement 
    (querySpecification SELECT 
      (selectElements 
        (selectElement 
          (fullColumnName 
            (uid 
              (simpleId CUST_NAME))))) 
      (fromClause FROM 
        (tableSources 
          (tableSource 
            (tableSourceItem 
              (tableName 
                (fullId 
                  (uid 
                    (simpleId CUSTOMERS))))))) WHERE 
        (expression 
          (predicate 
            (predicate 
              (expressionAtom 
                (fullColumnName 
                  (uid 
                    (simpleId CUST_NAME))))) LIKE 
          (predicate 
            (expressionAtom 
              (constant 
                (stringLiteral 'Kash%'))))))))))
1
ответ дан Bart Kiers 15 August 2018 в 20:14
поделиться
  • 1
    Вышеприведенный код дает этот результат: строка 1:11 нет жизнеспособной альтернативы на входе '_' (dmlStatement _.. _ 'Kash%') – KCK 11 April 2018 в 08:06
  • 2
    Почему вы не включили это в свой первоначальный вопрос? – Bart Kiers 11 April 2018 в 08:07
  • 3
    Сожалею. Отредактировал вопрос – KCK 11 April 2018 в 08:08
  • 4
    Нет проблем. Проверьте мой отредактированный ответ. – Bart Kiers 11 April 2018 в 08:33
Другие вопросы по тегам:

Похожие вопросы: