Посмотрите пример в здесь , у Стивена есть ясный ответ для вас:
Так вот что происходит, начиная с метода верхнего уровня (Button1_Click for UI / MyController.Get для ASP.NET):
- Метод верхнего уровня вызывает GetJsonAsync (в контексте UI / ASP.NET).
- GetJsonAsync запускает REST запрос, вызвав HttpClient.GetStringAsync (все еще в контексте).
- GetStringAsync возвращает незавершенную задачу, указывая, что запрос REST не завершен.
- GetJsonAsync ожидает задачу, возвращенную GetStringAsync. Контекст захвачен и будет использоваться для продолжения использования метода GetJsonAsync позже. GetJsonAsync возвращает незавершенную задачу, указывая, что метод GetJsonAsync не завершен.
- Метод верхнего уровня синхронно блокирует задачу, возвращенную GetJsonAsync. Это блокирует контекстный поток.
- ... В конце концов, запрос REST завершится. Это завершает задачу, которая была возвращена GetStringAsync.
- Продолжение для GetJsonAsync теперь готово к запуску и ожидает, что контекст будет доступен, чтобы он мог выполняться в контексте.
- Тупик. Метод верхнего уровня блокирует поток контекста, ожидая завершения GetJsonAsync, и GetJsonAsync ожидает, что контекст будет бесплатным, чтобы он мог завершить. Для примера пользовательского интерфейса «контекст» представляет собой контекст пользовательского интерфейса; для примера ASP.NET «контекст» представляет собой контекст запроса ASP.NET.
Еще одна ссылка, которую вы должны прочитать:
Я в основном хочу «получить» все различные компоненты запроса, такие как выбранные столбцы списка, условия, подзапросы, имена таблиц и т. д.
blockquote>
tree
содержит все данные:ParseTree tree = mySqlParser.dmlStatement();
строка 1:11 нет жизнеспособной альтернативы на входе '_'
blockquote>Если вы посмотрите на 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%'))))))))))