mirror of
https://gitlab.gnome.org/jwestman/blueprint-compiler.git
synced 2025-05-05 16:09:07 -04:00
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:
parent
ad6a2cf538
commit
8d587b62a0
11 changed files with 182 additions and 211 deletions
|
@ -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, "}"),
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -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, ","),
|
||||
"]",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -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(),
|
||||
)
|
||||
"]",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -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, "}"),
|
||||
)
|
||||
)
|
||||
|
||||
|
|
|
@ -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
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -60,18 +60,18 @@ class Widget(AstNode):
|
|||
|
||||
widgets = Group(
|
||||
Widgets,
|
||||
Sequence(
|
||||
Keyword("widgets", True),
|
||||
OpenBracket(),
|
||||
[
|
||||
Keyword("widgets"),
|
||||
"[",
|
||||
Delimited(
|
||||
Group(
|
||||
Widget,
|
||||
UseIdent("name"),
|
||||
),
|
||||
Comma(),
|
||||
",",
|
||||
),
|
||||
CloseBracket(),
|
||||
)
|
||||
"]",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -61,15 +61,12 @@ item = Group(
|
|||
|
||||
strings = Group(
|
||||
Items,
|
||||
Sequence(
|
||||
Keyword("strings", True),
|
||||
OpenBracket(),
|
||||
Delimited(
|
||||
item,
|
||||
Comma()
|
||||
),
|
||||
CloseBracket(),
|
||||
)
|
||||
[
|
||||
Keyword("strings"),
|
||||
"[",
|
||||
Delimited(item, ","),
|
||||
"]",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -46,18 +46,18 @@ class StyleClass(AstNode):
|
|||
|
||||
styles = Group(
|
||||
Styles,
|
||||
Sequence(
|
||||
Keyword("styles", True),
|
||||
OpenBracket(),
|
||||
[
|
||||
Keyword("styles"),
|
||||
"[",
|
||||
Delimited(
|
||||
Group(
|
||||
StyleClass,
|
||||
UseQuoted("name")
|
||||
),
|
||||
Comma(),
|
||||
",",
|
||||
),
|
||||
CloseBracket(),
|
||||
)
|
||||
"]",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue