LINUX.ORG.RU

История изменений

Исправление loz, (текущая версия) :

Недавно проскакивала новость про язычек Red, в нем аналог PEG встроен в язык, примерно так получилось:

Red [
   description: {lsyscfg parser for LoR}
]

text: {
affinity_group_id=none,
"io_slots=21010284/none/1,21010204/none/1,21010205/none/1,2101028D/none/0",
"virtual_eth_adapters=""72/1/1/704,706,744,714,715,700/1/0/ETHERNET0//all/none"",73/0/199//0/0/ETHERNET0//all/none,74/0/714//0/0/ETHERNET0//all/none",
}

ws-chars: charset reduce [space tab newline]

quoted-value: [ keep any [ not [ #"^"" |  #"," ] skip ] ]
double-quoted-value: [ {""} keep any [ not {""} 2 skip ] {""} ]
quoted-comma-value: [ ahead "^"^"" double-quoted-value | quoted-value ]
quoted-comma-values: [ quoted-comma-value any [ #"," quoted-comma-value ] ]
quoted-key-pair: [ #"^"" keep any [not #"=" skip ] #"=" quoted-comma-values #"^"" ]
key-pair: [ keep any [not #"=" skip] #"=" keep any [not #"," skip] ]
group: [ ws [ ahead #"^"" collect quoted-key-pair | collect key-pair ] ]
rules: [ collect [ group any [ #"," group ] ] ]
ws: [any ws-chars]

probe parse text rules
 ~/red  red lor.red
[["affinity_group_id" "none"] ["io_slots" "21010284/none/1" "21010204/none/1" "21010205/none/1" "2101028D/none/0"] ["virtual_eth_adapters" {72/1/1/704,706,744,714,715,700/1/0/ETHERNET0//all/none} "73/0/199//0/0/ETHERNET0//all/none" "74/0/714//0/0/ETHERNET0//all/none"] []]

Ну и так далее, дальше можно внутри разобрать по слешикам если надо.

Исходная версия loz, :

Недавно проскакивала новость про язычек Red, в нем аналог PEG встроен в язык, примерно так получилось:

Red [
   description: {lsyscfg parser for LoR}
]

text: {
affinity_group_id=none,
"io_slots=21010284/none/1,21010204/none/1,21010205/none/1,2101028D/none/0",
"virtual_eth_adapters=""72/1/1/704,706,744,714,715,700/1/0/ETHERNET0//all/none"",73/0/199//0/0/ETHERNET0//all/none,74/0/714//0/0/ETHERNET0//all/none",
}

ws-chars: charset reduce [space tab newline]

quoted-value: [ keep any [ not [ #"^"" |  #"," ] skip ] ]
double-quoted-value: [ {""} keep any [ not {""} 2 skip ] {""} ]
quoted-comma-value: [ ahead "^"^"" double-quoted-value | quoted-value ]
quoted-comma-values: [ quoted-comma-value any [ #"," quoted-comma-value ] ]
quoted-key-pair: [ #"^"" keep any [not #"=" skip ] #"=" quoted-comma-values #"^"" ]
key-pair: [ keep any [not #"=" skip] #"=" keep any [not #"," skip] ]
group: [ ws [ ahead #"^"" collect quoted-key-pair | collect key-pair ] ]
rules: [ collect [ group any [ #"," group ] ] ]
ws: [any ws-chars]

probe parse text rules
 ~/red  red lor.red
[["affinity_group_id" "none"] ["io_slots" "21010284/none/1" "21010204/none/1" "21010205/none/1" "2101028D/none/0"] ["virtual_eth_adapters" {72/1/1/704,706,744,714,715,700/1/0/ETHERNET0//all/none} "73/0/199//0/0/ETHERNET0//all/none" "74/0/714//0/0/ETHERNET0//all/none"] []]