Přeskočit obsah

Výrazy pro PARSEC¤

Skupina výrazů PARSEC reprezentuje koncept Parser combinator.

Poskytuje způsob, jak kombinovat základní parsery za účelem konstrukce složitějších parserů na základě určitých pravidel. V tomto kontextu je parser funkce, která přijímá řetězec jako vstup a vytváří strukturovaný výstup, který indikuje úspěšné parsování nebo poskytuje chybové hlášení, pokud proces parsování selže.

Parsovací výrazy se dělí do dvou skupin: parsery a kombinátory.

Parsery lze považovat za základní jednotky nebo stavební bloky. Jsou zodpovědné za rozpoznávání a zpracování konkrétních vzorů nebo prvků ve vstupním řetězci.

Kombinátory jsou naproti tomu operátory nebo funkce, které umožňují kombinaci a skládání parserů.

Každý výraz pro parsování začíná předponou !PARSE..


!PARSE.DIGIT: Parsuje jednu číslici¤

Typ: Parser.

Synopsis:

!PARSE.DIGIT

Example

Vstupní řetězec: 2

!PARSE.DIGIT

!PARSE.DIGITS: Parsuje více číslic¤

Typ: Parser.

Synopsis:

!PARSE.DIGITS
min: <...>
max: <...>
exactly: <...>

Pole min, max a exactly jsou nepovinná.

Varování

Pole Exactly nelze použít společně s poli min nebo max. A samozřejmě hodnota max nesmí být menší než hodnota min.

Příklad

Vstupní řetězec: 123

!PARSE.DIGITS
max: 4
Další příklady Parsování co nejvíce číslic:
!PARSE.DIGITS
Parsování přesně tří číslic:
!PARSE.DIGITS
exactly: 3
Parsování alespoň dvou číslic, ale ne více než čtyř:
!PARSE.DIGITS
min: 2
max: 4

!PARSE.LETTER: Parsuje jedno písmeno¤

Latinská písmena od A do Z, malá i velká písmena.

Typ: Parser.

Synopsis:

!PARSE.LETTER

Příklad

Vstupní řetězec: A

!PARSE.LETTER

!PARSE.CHAR: Parsuje jeden znak¤

Jakýkoli typ znaku.

Typ: Parser.

Synopsis:

!PARSE.CHAR

Příklad

Vstupní řetězec: @

!PARSE.CHAR

!PARSE.CHARS: Parsuje posloupnost znaků¤

Typ: Parser.

Synopsis:

!PARSE.CHARS
min: <...>
max: <...>
exactly: <...>
Pole min, max a přesně jsou nepovinná.

Varování

Pole Exactly nelze použít společně s poli min nebo max. A samozřejmě hodnota max nesmí být menší než hodnota min.

Příklad

Vstupní řetězec: jméno@123_

!PARSE.CHARS
max: 8

Tip

Pro analýzu až do konce řetězce použijte !PARSE.CHARS bez polí.

Další příklady Parsování co nejvíce znaků:
!PARSE.CHARS
Parsování přesně 3 znaků:
!PARSE.CHARS
exactly: 3
Parsováníe alespoň 2 znaků, ale ne více než 4:
!PARSE.CHARS
min: 2
max: 4

!PARSE.SPACE: Parsuje jednu mezeru¤

Typ: Parser.

Synopsis:

!PARSE.SPACE


!PARSE.SPACES: Parsuje více mezer¤

Parsování co největšího počtu znaků mezery:

Typ: Parser.

Synopsis:

!PARSE.SPACES

!PARSE.ONEOF: Parsuje jeden znak z množiny znaků¤

Typ: Parser.

Synopsis:

!PARSE.ONEOF
what: <...>
nebo kratší verze:

!PARSE.ONEOF <...>

Příklad

Vstupní řetězec: Wow!

!PARSE.ONEOF
what: "!?"

!PARSE.NONEOF: Parsuje jeden znak, který není v množině znaků¤

Typ: Parser.

Synopsis:

!PARSE.NONEOF
what: <...>
nebo kratší verze:
!PARSE.NONEOF <...>

Příklad

Vstupní řetězec: Wow!

!PARSE.NONEOF
what: ",;:[]()"

!PARSE.UNTIL: Parsuje posloupnost znaků, dokud není nalezen konkrétní znak¤

Typ: Parser.

Synopsis:

!PARSE.UNTIL
what: <...>
stop: <before/after>
eof: <true/false>
nebo kratší verze:

!PARSE.UNTIL <...>
  • stop - určuje, zda se má znak stop analyzovat nebo ne. Možné hodnoty: before nebo after(výchozí).

  • eof - udává, zda máme analyzovat až do konce řetězce, pokud není nalezen symbol what. Možné hodnoty: true nebo false(výchozí).

Info

Pole what musí být jednoznakové. Lze však použít i některé bílé znaky, jako např. tab.

Příklad

Vstupní řetězec: 60290:11

!PARSE.UNTIL
what: ":"
Další příklady Parsování až do symbolu : a zastavení před ním:
!PARSE.UNTIL
what: ":"
stop: "před"
Parsování až do symbolu mezery a zastavení za ním:
!PARSE.UNTIL ' '
Parsování až do symbolu , symbol nebo do konce řetězce, pokud není symbol nalezen.
!PARSE.UNTIL
what: ","
eof: true
Parsování do symbolu tab:
!PARSE.UNTIL
what: 'tab'

!PARSE.EXACTLY: Parsovat přesně definovanou posloupnost znaků¤

Typ: Parser.

Synopsis:

!PARSE.EXACTLY
what: <...>

nebo kratší verze:

!PARSE.EXACTLY <...>

Příklad

Vstupní řetězec: Hello world!

!PARSE.EXACTLY
what: "Hello"

!PARSE.BETWEEN: Parsuje posloupnost znaků mezi dvěma konkrétními znaky¤

Typ: Parser.

Synopsis:

!PARSE.BETWEEN
what: <...>
start: <...>
stop: <...>
escape: <...>

nebo kratší verze:

!PARSE.BETWEEN <...>
  • what - označuje, mezi kterými stejnými znaky máme provést parsování.

  • start, stop - udává, mezi kterými různými znaky máme provést parsování.

  • escape - označuje znak escape.

Příklad

Vstupní řetězec: [10/May/2023:08:15:54 +0000]

!PARSE.BETWEEN
start: '['
stop: ']'

Další příklady

Parsování mezi dvojitými uvozovkami:

!PARSE.BETWEEN
what: '"'

Parsování mezi dvojitými uvozovkami, zkrácená forma:

!PARSE.BETWEEN '"'

Parsování mezi dvojitými uvozovkami, přeskakuje interní dvojité uvozovky:

Vstupní řetězec:"jedna, "dva", tři"

!PARSE.BETWEEN
what: '"'
escape: '\'


!PARSE.REGEX: Parsuje posloupnost znaků, která odpovídá regulárnímu výrazu¤

Typ: Parser.

Synopsis:

!PARSE.REGEX
what: <...>

Příklad

Vstupní řetězec: FTVW23_L-C: Message...

Výstupní řetězec: FTVW23_L-C

!PARSE.REGEX
what: '[a-zA-Z0-9_\-0]+'

!PARSE.MONTH: Parsuje jméno měsíce¤

Typ: Parser.

Synopsis:

!PARSE.MONTH
what: <...>

nebo kratší verze:

!PARSE.MONTH <...>
  • what - udává formát názvu měsíce. Možné hodnoty: number, short, full.

Tip

Pomocí !PARSE.MONTH analyzujete název měsíce jako součást !PARSE.DATETIME.

Příklad

Vstupní řetězec: 10/May/2023:08:15:54

!PARSE.MONTH
what: 'short'
Další příklady Parsování měsíce v číselném formátu:
Vstupní řetězec:2003-10-11
!PARSE.MONTH 'číslo'
Parsování měsíce v plném formátu:
Vstupní řetězec:2003-OCTOBER-11
!PARSE.MONTH
what: 'full'

!PARSE.FRAC: Parsuje zlomek¤

Typ: Parser.

Synopsis:

!PARSE.FRAC
base: <...>
max: <...>

  • base - udává základ zlomku. Možné hodnoty: milli, micro, nano.
  • max - udává maximální počet číslic v závislosti na hodnotě base. Možné hodnoty: 3, 6, 9.

Tip

Pomocí !PARSE.FRAC lze analyzovat mikrosekundy nebo nanosekundy jako součást !PARSE.DATETIME.

Příklad

Vstupní řetězec: Aug 22 05:40:14.264

!PARSE.FRAC
base: "micro"
max: 6

!PARSE.DATETIME: Parsování data v daném formátu¤

Typ: Parser.

Synopsis:

!PARSE.DATETIME
- year: <...>
- month: <...>
- day: <...>
- hour: <...>
- minute: <...>
- second: <...>
- nanosecond: <...>
- timezone: <...>
  • Pole month, day jsou povinná.
  • Pole year je nepovinné. Pokud není zadáno, použije se funkce smart year.
  • Pole hour, minute, second, microsecond, nanosecond jsou nepovinná. Pokud nejsou zadána, použije se výchozí hodnota 0.
  • Zadání pole mikrosekund jako microsecond?, umožní parsovat mikrosekundy, pokud se vyskytují ve vstupním řetězci, a jinak ne.
  • Pole timezone je nepovinné. Pokud není zadáno, použije se výchozí hodnota UTC. Lze jej zadat ve dvou různých formátech.
    1. Z, +08:00 - analyzuje se ze vstupního řetězce.
    2. Evropa/Praha - zadáno jako konstantní hodnota.

Zkratky¤

K dispozici jsou tvary zkratek (v obou nižších/vyšších variantách):

!PARSE.DATETIME RFC3339
!PARSE.DATETIME iso8601

Příklad

Vstupní řetězec: 2022-10-13T12:34:56.987654

!PARSE.DATETIME
- year: !PARSE.DIGITS
- '-'
- month: !PARSE.MONTH 'číslo'
- '-'
- day: !PARSE.DIGITS
- 'T'
- hour: !PARSE.DIGITS
- ':'
- minute: !PARSE.DIGITS
- ':'
- second: !PARSE.DIGITS
- microsecond: !PARSE.FRAC
                base: "micro"
                max: 6
- timezone: "Europe/Prague"

Další příklady Parsování data bez roku, s krátkým tvarem měsíce a volitelnými mikrosekundami:
Vstupní řetězec: Aug 17 06:57:05.189
!PARSE.DATETIME
- month: !PARSE.MONTH 'short' # Měsíc
- !PARSE.SPACE
- day: !PARSE.DIGITS # Den
- !PARSE.SPACE
- hour: !PARSE.DIGITS # Hodiny
- !PARSE.EXACTLY { what: ':' }
- minute: !PARSE.DIGITS # Minuty
- !PARSE.EXACTLY { what: ':' }
- second: !PARSE.DIGITS # Sekundy
- microsecond?: !PARSE.FRAC # Mikrosekundy
                base: "micro"
                max: 6
Parse datetime s časovou zónou:
Vstupní řetězec: 2021-06-29T16:51:43+08:00
!PARSE.DATETIME
- year: !PARSE.DIGITS
- '-'
- month: !PARSE.MONTH 'číslo'
- '-'
- day: !PARSE.DIGITS
- 'T'
- hour: !PARSE.DIGITS
- ':'
- minute: !PARSE.DIGITS
- ':'
- second: !PARSE.DIGITS
- timezone: !PARSE.CHARS
Parse datetime pomocí zkratky:
Vstupní řetězec: 2021-06-29T16:51:43Z
!PARSE.DATETIME RFC3339
Parsování datetime pomocí zkratky:
Vstupní řetězec: 20201211T111721Z
!PARSE.DATETIME iso8601
Parsování data s nanosekundami:
Vstupní řetězec: 2023-03-23T07:00:00.734323900
!PARSE.DATETIME
- year: !PARSE.DIGITS
- !PARSE.EXACTLY { what: '-' }
- month: !PARSE.DIGITS
- !PARSE.EXACTLY { what: '-' }
- day: !PARSE.DIGITS
- !PARSE.EXACTLY { what: 'T' }
- hour: !PARSE.DIGITS
- !PARSE.EXACTLY { what: ':' }
- minute: !PARSE.DIGITS
- !PARSE.EXACTLY { what: ':' }
- second: !PARSE.DIGITS
- nanosekunda: !PARSE.FRAC
  base: "nano"
  max: 9