hwdb: fix parser to work with newer pyparsing

The handling of whitespace in pyparsing is a bother. There's some
global state, and per-element state, and it's hard to get a handle on
things. With python3-pyparsing-2.4.7-10.fc36.noarch the grammar would
not match. After handling of tabs was fixed to not accept duplicate tabs,
the grammar passes.

It seems that the entry for usb:v8087p8087*
was generated incorrectly because we treated the interface line
(with two TABs) as a device line (with one TAB).
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2022-03-29 12:17:51 +02:00
parent 88a65c936e
commit f73d689587
2 changed files with 8 additions and 5 deletions

View file

@ -69815,9 +69815,6 @@ usb:v8087p8008*
usb:v8087p800A* usb:v8087p800A*
ID_MODEL_FROM_DATABASE=Hub ID_MODEL_FROM_DATABASE=Hub
usb:v8087p8087*
ID_MODEL_FROM_DATABASE=07da Centrino Advanced-N 6235
usb:v80EE* usb:v80EE*
ID_VENDOR_FROM_DATABASE=VirtualBox ID_VENDOR_FROM_DATABASE=VirtualBox

View file

@ -6,7 +6,7 @@ import sys
from pyparsing import (Word, White, Literal, Regex, from pyparsing import (Word, White, Literal, Regex,
LineEnd, SkipTo, LineEnd, SkipTo,
ZeroOrMore, OneOrMore, Combine, Optional, Suppress, ZeroOrMore, OneOrMore, Combine, Optional, Suppress,
Group, Group, ParserElement,
stringEnd, pythonStyleComment) stringEnd, pythonStyleComment)
EOL = LineEnd().suppress() EOL = LineEnd().suppress()
@ -20,6 +20,8 @@ COMMENTLINE = pythonStyleComment + EOL
EMPTYLINE = LineEnd() EMPTYLINE = LineEnd()
text_eol = lambda name: Regex(r'[^\n]+')(name) + EOL text_eol = lambda name: Regex(r'[^\n]+')(name) + EOL
ParserElement.set_default_whitespace_chars(' \n')
def klass_grammar(): def klass_grammar():
klass_line = Literal('C ').suppress() + NUM2('klass') + text_eol('text') klass_line = Literal('C ').suppress() + NUM2('klass') + text_eol('text')
subclass_line = TAB + NUM2('subclass') + text_eol('text') subclass_line = TAB + NUM2('subclass') + text_eol('text')
@ -35,8 +37,12 @@ def klass_grammar():
def usb_ids_grammar(): def usb_ids_grammar():
vendor_line = NUM4('vendor') + text_eol('text') vendor_line = NUM4('vendor') + text_eol('text')
device_line = TAB + NUM4('device') + text_eol('text') device_line = TAB + NUM4('device') + text_eol('text')
interface_line = TAB + TAB + NUM4('interface') + NUM4('interface2') + text_eol('text')
device = (device_line +
ZeroOrMore(Group(interface_line)
^ COMMENTLINE.suppress()))
vendor = (vendor_line('VENDOR') + vendor = (vendor_line('VENDOR') +
ZeroOrMore(Group(device_line)('VENDOR_DEV*') ^ COMMENTLINE.suppress())) ZeroOrMore(Group(device)('VENDOR_DEV*') ^ COMMENTLINE.suppress()))
klass = klass_grammar() klass = klass_grammar()