parser: Simplify parser construction

- Replace several different parse nodes with Match, which matches the
  exact text of a token but not the token type
- Allow arrays to be used in place of Sequence
This commit is contained in:
James Westman 2022-01-04 16:59:19 -06:00
parent ad6a2cf538
commit 8d587b62a0
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
11 changed files with 182 additions and 211 deletions

View file

@ -155,18 +155,18 @@ a11y_prop = Group(
A11yProperty,
Statement(
UseIdent("name"),
Op(":"),
":",
value.expected("a value"),
)
)
a11y = Group(
A11y,
Sequence(
Keyword("accessibility", True),
OpenBlock(),
Until(a11y_prop, CloseBlock()),
)
[
Keyword("accessibility"),
"{",
Until(a11y_prop, "}"),
]
)

View file

@ -52,28 +52,23 @@ class Item(BaseTypedAttribute):
item = Group(
Item,
Sequence(
Optional(
Sequence(
UseIdent("name"),
Op(":"),
)
),
[
Optional([
UseIdent("name"),
":",
]),
value,
)
]
)
items = Group(
Items,
Sequence(
Keyword("items", True),
OpenBracket(),
Delimited(
item,
Comma()
),
CloseBracket(),
)
[
Keyword("items"),
"[",
Delimited(item, ","),
"]",
]
)

View file

@ -49,22 +49,22 @@ class FilterString(AstNode):
def create_node(tag_name: str, singular: str):
return Group(
Filters,
Sequence(
Keyword(tag_name, True),
[
Keyword(tag_name),
UseLiteral("tag_name", tag_name),
OpenBracket(),
"[",
Delimited(
Group(
FilterString,
Sequence(
[
UseQuoted("name"),
UseLiteral("tag_name", singular),
)
]
),
Comma(),
",",
),
CloseBracket(),
)
"]",
]
)

View file

@ -53,7 +53,7 @@ layout_prop = Group(
LayoutProperty,
Statement(
UseIdent("name"),
Op(":"),
":",
value.expected("a value"),
)
)
@ -61,9 +61,9 @@ layout_prop = Group(
layout = Group(
Layout,
Sequence(
Keyword("layout", True),
OpenBlock(),
Until(layout_prop, CloseBlock()),
Keyword("layout"),
"{",
Until(layout_prop, "}"),
)
)

View file

@ -51,94 +51,94 @@ menu_contents = Sequence()
menu_section = Group(
Menu,
Sequence(
Keyword("section"),
[
"section",
UseLiteral("tag", "section"),
Optional(UseIdent("id")),
menu_contents
)
]
)
menu_submenu = Group(
Menu,
Sequence(
Keyword("submenu"),
[
"submenu",
UseLiteral("tag", "submenu"),
Optional(UseIdent("id")),
menu_contents
)
]
)
menu_attribute = Group(
MenuAttribute,
Sequence(
[
UseIdent("name"),
Op(":"),
":",
value.expected("a value"),
StmtEnd().expected("`;`"),
)
Match(";").expected(),
]
)
menu_item = Group(
Menu,
Sequence(
Keyword("item"),
[
"item",
UseLiteral("tag", "item"),
Optional(UseIdent("id")),
OpenBlock().expected("`{`"),
Until(menu_attribute, CloseBlock()),
)
Match("{").expected(),
Until(menu_attribute, "}"),
]
)
menu_item_shorthand = Group(
Menu,
Sequence(
Keyword("item"),
[
"item",
UseLiteral("tag", "item"),
OpenParen(),
"(",
Group(
MenuAttribute,
Sequence(UseLiteral("name", "label"), value),
[UseLiteral("name", "label"), value],
),
Optional(Sequence(
Comma(),
Optional(Sequence(
Optional([
",",
Optional([
Group(
MenuAttribute,
Sequence(UseLiteral("name", "action"), value),
[UseLiteral("name", "action"), value],
),
Optional(Sequence(
Comma(),
Optional([
",",
Group(
MenuAttribute,
Sequence(UseLiteral("name", "icon"), value),
[UseLiteral("name", "icon"), value],
),
))
))
)),
CloseParen().expected("')'"),
)
])
])
]),
Match(")").expected(),
]
)
menu_contents.children = [
OpenBlock(),
Match("{"),
Until(AnyOf(
menu_section,
menu_submenu,
menu_item_shorthand,
menu_item,
menu_attribute,
), CloseBlock()),
), "}"),
]
menu = Group(
Menu,
Sequence(
Keyword("menu"),
[
"menu",
UseLiteral("tag", "menu"),
Optional(UseIdent("id")),
menu_contents
),
],
)

View file

@ -60,18 +60,18 @@ class Widget(AstNode):
widgets = Group(
Widgets,
Sequence(
Keyword("widgets", True),
OpenBracket(),
[
Keyword("widgets"),
"[",
Delimited(
Group(
Widget,
UseIdent("name"),
),
Comma(),
",",
),
CloseBracket(),
)
"]",
]
)

View file

@ -61,15 +61,12 @@ item = Group(
strings = Group(
Items,
Sequence(
Keyword("strings", True),
OpenBracket(),
Delimited(
item,
Comma()
),
CloseBracket(),
)
[
Keyword("strings"),
"[",
Delimited(item, ","),
"]",
]
)

View file

@ -46,18 +46,18 @@ class StyleClass(AstNode):
styles = Group(
Styles,
Sequence(
Keyword("styles", True),
OpenBracket(),
[
Keyword("styles"),
"[",
Delimited(
Group(
StyleClass,
UseQuoted("name")
),
Comma(),
",",
),
CloseBracket(),
)
"]",
]
)