Научиться по составу разобрать слово: Словарь синонимов sinonim.org

оператор синтаксического анализа | Microsoft Learn

  • Статья

Вычисляет строковое выражение и анализирует его значение в один или несколько вычисляемых столбцов. Вычисляемые столбцы будут иметь нули для неудачно проанализированных строк. Если нет необходимости использовать строки, синтаксический анализ которых не увенчался успехом, лучше использовать оператор parse-where.

Синтаксис

T | parse [ вид = вид [ флаги = regexFlags ]] выражение с [ * ] строка Константа имя столбца [ : тип столбца ] [ * ] ,

Параметры

Имя Тип Обязательно Описание
Т строка Табличный ввод для анализа.
вид строка Одно из поддерживаемых значений вида. Значение по умолчанию — простых
.
флаги регулярных выражений строка Если тип равен регулярному выражению , то вы можете указать флаги регулярного выражения, которые будут использоваться, например, U для нежадного, m для многострочного режима, s для соответствия новой строке \n и i для без учета регистра. Другие флаги можно найти в флагах RE2.
выражение строка Выражение, результатом которого является строка.
строкаКонстанта строка Строковая константа для поиска и анализа.
имя столбца строка Имя столбца, которому нужно присвоить значение, извлеченное из строкового выражения.
Тип столбца строка Скалярное значение, указывающее тип, в который нужно преобразовать значение. По умолчанию используется строка .

Примечание

  • Шаблон синтаксического анализа может начинаться с ColumnName , а не только с Строковая Константа .
  • Используйте * в шаблоне, чтобы пропустить ненужные значения. * нельзя использовать после столбца типа строки .
  • Если проанализированное выражение не имеет тип string , оно будет преобразовано в тип string .
  • Используйте проект , если вы также хотите удалить или переименовать некоторые столбцы.

Поддерживаемые типы значений

Текст Описание
простой
Это значение по умолчанию. stringConstant — это обычное строковое значение, соответствие строгое. В проанализированной строке должны появиться все разделители строк, а все расширенные столбцы должны соответствовать требуемым типам.
регулярное выражение stringConstant может быть регулярным выражением, и соответствие является строгим. Все разделители строк, которые могут быть регулярными выражениями для этого режима, должны появиться в анализируемой строке, а все расширенные столбцы должны соответствовать требуемым типам.
расслабленный stringConstant — это обычное строковое значение, и совпадение ослаблено. В анализируемой строке должны появиться все разделители строк, но расширенные столбцы могут частично соответствовать требуемым типам. Расширенные столбцы, не соответствующие требуемым типам, получат значение
null
.

Режим регулярных выражений

В режиме регулярных выражений синтаксический анализ преобразует шаблон в регулярное выражение. Используйте синтаксис RE2 для сопоставления и используйте пронумерованные захваченные группы, которые обрабатываются внутри. Например:

 parse kind=regex Col with *  var1:string  var2:long
 

В операторе синтаксического анализа регулярное выражение, которое будет сгенерировано внутри синтаксического анализа, имеет вид .*?(.*?)(\-\d+) .

  • * было переведено в .*? .

  • строка была переведена в .*? .

  • long было преобразовано в \-\d+ .

Возвращает

Входная таблица, расширенная в соответствии со списком столбцов, которые предоставляется оператору.

Примеры

Оператор синтаксического анализа обеспечивает упрощенный способ расширения таблицы с помощью нескольких приложений извлечения в одном выражении строки . Этот результат полезен, когда в таблице есть столбец string , который содержит несколько значений, которые вы хотите разбить на отдельные столбцы. Например, столбец, созданный трассировкой разработчика (« printf «/» Console.WriteLine «) оператор.

В приведенном ниже примере предположим, что столбец EventText таблицы Traces содержит строки вида Событие: NotifySliceRelease (resourceName={0}, totalSlices={1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5})

. Операция расширит таблицу шестью столбцами: resourceName , totalSlices , sliceNumber , lockTime , ReleaseTime и предыдущееLockTime .

Запустить запрос

 let Traces = datatable(EventText: string)
    [
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 23, lockTime = 17. 02.2016 08:40:01, releaseTime = 17.02.2016 08:40:01, previousLockTime = 17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 15, lockTime = 17.02.2016 08:40:00, releaseTime = 17.02.2016 08:40:00, previousLockTime = 17.02.2016 08:39:00)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 20, lockTime = 17.02.2016 08:40:01, releaseTime = 17.02.2016 08:40:01, previousLockTime = 17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 22, lockTime = 17.02.2016 08:41:01, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 16, lockTime = 17.02.2016 08:41:00, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:00)"
];
Следы
| анализировать EventText с помощью * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previousLockTime: date ")" *
| имя_ресурса проекта, totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime
 

Выход

Всего
имя_ресурса фрагментов номер среза время блокировки время выпуска предыдущийLockTime
PipelineScheduler 27 15 17. 02.2016 08:40:00 2016-02-17 08:40:00.0000000 2016-02-17 08:39:00.0000000
PipelineScheduler 27 23 17.02.2016 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler 27 20 17.02.2016 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler 27 16 17.02.2016 08:41:00 2016-02-17 08:41:00.0000000 17.02.2016 08:40:00.0000000
PipelineScheduler
27
22 17.02.2016 08:41:01 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

Режим регулярных выражений

Выполнить запрос

 let Traces = datatable(EventText: string)
    [
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 23, lockTime = 17. 02.2016 08:40:01, releaseTime = 17.02.2016 08:40:01, previousLockTime = 17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 15, lockTime = 17.02.2016 08:40:00, releaseTime = 17.02.2016 08:40:00, previousLockTime = 17.02.2016 08:39:00)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 20, lockTime = 17.02.2016 08:40:01, releaseTime = 17.02.2016 08:40:01, previousLockTime = 17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 22, lockTime = 17.02.2016 08:41:01, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 16, lockTime = 17.02.2016 08:41:00, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:00)"
];
Следы
| parse kind = regex EventText with "(.*?)[a-zA-Z]*=" resourceName @", totalSlices=\s*\d+\s*.
*?sliceNumber=" sliceNumber: long ".*?( предыдущая)?lockTime=" lockTime ".*?releaseTime=" releaseTime ".*?previousLockTime=" предыдущаяLockTime: дата "\\)" | имя ресурса проекта, номер слайса, время блокировки, время выпуска, время предыдущей блокировки

Выход

имя_ресурса номер среза время блокировки время выпуска предыдущийLockTime
PipelineScheduler 15 17.02.2016 08:40:00, 17.02.2016 08:40:00, 2016-02-17 08:39:00.0000000
PipelineScheduler 23 17.02.2016 08:40:01, 17.02.2016 08:40:01, 2016-02-17 08:39:01.0000000
PipelineScheduler 20 17.02.2016 08:40:01, 17.02.2016 08:40:01, 2016-02-17 08:39:01.0000000
PipelineScheduler 16 17. 02.2016 08:41:00, 17.02.2016 08:41:00, 2016-02-17 08:40:00.0000000
PipelineScheduler 22 17.02.2016 08:41:01, 17.02.2016 08:41:00, 2016-02-17 08:40:01.0000000

Режим регулярных выражений с флагами регулярных выражений

Если вы хотите получить только имя ресурса, используйте этот запрос:

Запустите запрос

 let Traces = datatable(EventText: string)
    [
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 23, lockTime = 17.02.2016 08:40:01, releaseTime = 17.02.2016 08:40:01, previousLockTime = 17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 15, lockTime = 17.02.2016 08:40:00, releaseTime = 17.02.2016 08:40:00, previousLockTime = 17.02.2016 08:39:00)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 20, lockTime = 17. 02.2016 08:40:01, releaseTime = 17.02.2016 08:40:01, previousLockTime = 17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 22, lockTime = 17.02.2016 08:41:01, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 16, lockTime = 17.02.2016 08:41:00, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:00)"
];
Следы
| parse kind = регулярное выражение EventText с * "resourceName=" имя_ресурса ',' *
| название ресурса проекта
 

Выход

имя_ресурса
PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=17.02.2016 08:40:01, releaseTime=17.02.2016 08:40:01
PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=17.02.2016 08:40:00, releaseTime=17.02.2016 08:40:00
PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=17. 02.2016 08:40:01, releaseTime=17.02.2016 08:40:01
PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=17.02.2016 08:41:01, releaseTime=17.02.2016 08:41:00
PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=17.02.2016 08:41:00, releaseTime=17.02.2016 08:41:00

Вы не получите ожидаемых результатов, так как режим по умолчанию жадный. Если у вас есть несколько записей, в которых имя_ресурса иногда отображается в нижнем регистре, а иногда в верхнем регистре, вы можете получить пустые значения для некоторых значений.

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

Запустить запрос

 let Traces = datatable(EventText: string)
    [
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 23, lockTime = 17. 02.2016 08:40:01, releaseTime = 17.02.2016 08:40:01, previousLockTime = 17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 15, lockTime = 17.02.2016 08:40:00, releaseTime = 17.02.2016 08:40:00, previousLockTime = 17.02.2016 08:39:00)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 20, lockTime = 17.02.2016 08:40:01, releaseTime = 17.02.2016 08:40:01, previousLockTime = 17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 22, lockTime = 17.02.2016 08:41:01, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 16, lockTime = 17.02.2016 08:41:00, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:00)"
];
Следы
| parse kind = regex flags = Ui EventText with * "RESOURCENAME=" имя_ресурса ',' *
| название ресурса проекта
 

Выход

имя_ресурса
PipelineScheduler
PipelineScheduler
PipelineScheduler
PipelineScheduler
PipelineScheduler

Если проанализированная строка содержит новые строки, используйте флаг s для анализа текста.

Запустить запрос

 let Traces = datatable(EventText: string)
    [
    «Событие: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=23\nlockTime=17.02.2016 08:40:01\nreleaseTime=17.02.2016 08:40:01\npreviousLockTime=17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=15\nlockTime=17.02.2016 08:40:00\nreleaseTime=17.02.2016 08:40:00\npreviousLockTime=17.02.2016 08:39:00)",
    «Событие: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=20\nlockTime=17.02.2016 08:40:01\nreleaseTime=17.02.2016 08:40:01\npreviousLockTime=17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=22\nlockTime=17.02.2016 08:41:01\nreleaseTime=17.02.2016 08:41:00\npreviousLockTime=17.02.2016 08:40:01)",
    «Событие: NotifySliceRelease (resourceName=PipelineScheduler\ntotalSlices=27\nsliceNumber=16\nlockTime=17.02. 2016 08:41:00\nreleaseTime=17.02.2016 08:41:00\npreviousLockTime=17.02.2016 08:40:00)"
];
Следы
| анализировать kind=regex flags=s EventText с * "resourceName=" resourceName: string "(.*?) totalSlices=" totalSlices: long "(.*?)lockTime=" lockTime: datetime "(.*?)releaseTime=" releaseTime: datetime "(.*?)previousLockTime = "previousLockTime: datetime" \\)"
| EventText вне проекта
 

Выход

Всего
имя_ресурса фрагментов время блокировки время выпуска предыдущийLockTime
PipelineScheduler
27 2016-02-17 08:40:00.0000000 2016-02-17 08:40:00.0000000 2016-02-17 08:39:00.0000000
PipelineScheduler
27 17.02.2016 08:40:01.0000000 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler
27 2016-02-17 08:40:01. 0000000 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler
27 2016-02-17 08:41:00.0000000 2016-02-17 08:41:00.0000000 2016-02-17 08:40:00.0000000
PipelineScheduler
27 2016-02-17 08:41:01.0000000 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

Расслабленный режим

В этом примере для упрощенного режима расширенный столбец totalSlices должен иметь тип long . Однако в проанализированной строке оно имеет значение nonValidLongValue . В расширенном столбце releaseTime значение nonValidDateTime не может быть проанализировано как дата-время . Эти два расширенных столбца получат значение null , в то время как другие, такие как sliceNumber , по-прежнему получат правильные значения.

Если вы используете опцию kind = simple для того же запроса ниже, вы получите null для всех расширенных столбцов. Этот параметр является строгим для расширенных столбцов и представляет собой разницу между упрощенным и простым режимами.

Примечание

В упрощенном режиме расширенные столбцы могут частично совпадать.

Запустить запрос

 let Traces = datatable(EventText: string)
    [
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 23, lockTime = 17.02.2016 08:40:01, releaseTime = nonValidDateTime 08:40:01, previousLockTime = 17.02.2016 08:39: 01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 15, lockTime = 17.02.2016 08:40:00, releaseTime = nonValidDateTime, previousLockTime = 17.02.2016 08:39:00)»,
    «Событие: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=nonValidLongValue, sliceNumber=20, lockTime=17. 02.2016 08:40:01, releaseTime=nonValidDateTime 08:40:01, previousLockTime=17.02.2016 08:39:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = 27, sliceNumber = 22, lockTime = 17.02.2016 08:41:01, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:01)",
    «Событие: NotifySliceRelease (resourceName = PipelineScheduler, totalSlices = nonValidLongValue, sliceNumber = 16, lockTime = 17.02.2016 08:41:00, releaseTime = 17.02.2016 08:41:00, previousLockTime = 17.02.2016 08:40:00)"
];
Следы
| анализировать вид = расслабленный EventText с * "resourceName=" имяресурса ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" предыдущийLockTime: дата ")" *
| EventText вне проекта
 

Выход

Всего
имя_ресурса фрагментов номер среза время блокировки время выпуска предыдущийLockTime
PipelineScheduler 27 15 17. 02.2016 08:40:00 2016-02-17 08:39:00.0000000
PipelineScheduler 27 23 17.02.2016 08:40:01 2016-02-17 08:39:01.0000000
PipelineScheduler 20 17.02.2016 08:40:01 2016-02-17 08:39:01.0000000
PipelineScheduler 16 17.02.2016 08:41:00 2016-02-17 08:41:00.0000000 2016-02-17 08:40:00.0000000
PipelineScheduler 27 22 17.02.2016 08:41:01 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

Как анализ LR анализирует слово «a b» в этой грамматике: S -> a b | в ; T -> a

В этом случае синтаксический анализатор никогда не будет пытаться уменьшить T , потому что продукция T → a не находится ни в каком состоянии, полученном из S . Исходное состояние имеет элементы:

 S → • a b
S → • T
 

и единственное возможное действие в этом состоянии — это действие Shift с токеном и . Поскольку a фактически является следующим входным символом, мы делаем переход со сдвигом в состояние, набор элементов которого равен

 S → a • b
С → а • Т
Т → • а
 

В этом состоянии также нет действий сокращения, и у него есть два разных действия сдвига: одно для b и другое для a . Так как следующим вводом является b , это действие сдвига выполняется, что приводит к состоянию, набор элементов которого равен

 S → a b •
 

, в котором доступно только сокращение.

Несколько более интересным случаем может быть довольно похожая грамматика

 S → a b
S → T а
Т → а
 

Здесь набор товаров для начального состояния включает продукцию для T :

 S → • a b
S → • T а
Т → • а
 

Это по-прежнему так, что единственное действие, доступное в начальном состоянии, — это сдвинуть a , но теперь, после выполнения сдвига, мы оказываемся в состоянии, набор элементов которого:

 S → a • b
Т → а •
 

и теперь у нас есть два возможных действия: сдвиг b и сокращение T → a . Здесь синтаксический анализатор должен использовать свою способность смотреть один токен в будущее (при условии, что это синтаксический анализатор LR(1) ).

Но для этого нам нужно сделать небольшую настройку. Грамматики всегда «дополняются» до создания автомата синтаксического анализа. Расширенная грамматика добавляет явное распознавание конца ввода, добавляя уникальный символ конца ввода, который также может участвовать в предварительных проверках. Расширенная грамматика:

 С'→ С $
S → а б
S → T а
Т → а
 

В этой грамматике мы видим, что за нетерминалом T может следовать только символ a , и этот факт закодирован в таблицах переходов состояний, где каждый элемент в наборе элементов фактически аннотируется набором возможные прогнозы. (Во время построения таблицы все элементы аннотируются, но для расчета юридических действий учитываются только упреждающие сокращения; сокращение — это элемент, чей • стоит в конце.)

С этой модификацией набор элементов, достигаемый после сдвига a :

 S → a • b
T → a • [ просмотр вперед: { a } ]
 

, и просмотр вперед абсолютно ясно дает понять, какое действие следует выбрать.

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *