diff --git a/pydbml/definitions/column.py b/pydbml/definitions/column.py index 1cd37d0..75af2d7 100644 --- a/pydbml/definitions/column.py +++ b/pydbml/definitions/column.py @@ -11,6 +11,7 @@ from .generic import expression from .generic import expression_literal from .generic import name +from .generic import name_pattern from .generic import number_literal from .generic import string_literal from .reference import ref_inline @@ -22,7 +23,7 @@ type_args = ("(" + pp.original_text_for(expression) + ")") # column type is parsed as a single string, it will be split by blueprint -column_type = pp.Combine((name + pp.Literal('[]')) | (name + '.' + name) | ((name) + type_args[0, 1])) +column_type = pp.Regex(fr'{name_pattern}(\[\]|\.{name_pattern}|(\([^)]*\))?)') default = pp.CaselessLiteral('default:').suppress() + _ - ( string_literal diff --git a/pydbml/definitions/common.py b/pydbml/definitions/common.py index 8288de3..eb3da17 100644 --- a/pydbml/definitions/common.py +++ b/pydbml/definitions/common.py @@ -37,3 +37,4 @@ hex_char = pp.Word(pp.srange('[0-9a-fA-F]'), exact=1) hex_color = ("#" - (hex_char * 3 ^ hex_char * 6)).leaveWhitespace() +hex_color_pattern = r"#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})" # for use inside pp.Regex() diff --git a/pydbml/definitions/generic.py b/pydbml/definitions/generic.py index 180cca4..5be14e8 100644 --- a/pydbml/definitions/generic.py +++ b/pydbml/definitions/generic.py @@ -5,6 +5,7 @@ pp.ParserElement.set_default_whitespace_chars(' \t\r') name = pp.Word(pp.unicode.alphanums + '_') | pp.QuotedString('"') +name_pattern = r'(\b\w+\b|\".*?\")' # for use inside pp.Regex() # Literals @@ -13,11 +14,8 @@ ^ pp.QuotedString('"', escChar="\\") ^ pp.QuotedString("'''", escChar="\\", multiline=True) ) -expression_literal = pp.Combine( - pp.Suppress('`') - + pp.CharsNotIn('`')[...] - + pp.Suppress('`') -).set_parse_action(lambda s, lok, tok: ExpressionBlueprint(tok[0])) + +expression_literal = pp.Regex(r"`[^`]*`").set_parse_action(lambda s, lok, tok: ExpressionBlueprint(tok[0])) boolean_literal = ( pp.CaselessLiteral('true') @@ -26,9 +24,7 @@ ) number_literal = ( pp.Word(pp.nums) - ^ pp.Combine( - pp.Word(pp.nums) + '.' + pp.Word(pp.nums) - ) + ^ pp.Regex(r"\d+\.\d+") ) # Expression diff --git a/pydbml/definitions/reference.py b/pydbml/definitions/reference.py index 9b6450e..6af858f 100644 --- a/pydbml/definitions/reference.py +++ b/pydbml/definitions/reference.py @@ -5,6 +5,7 @@ from .common import c from .common import n from .generic import name +from .generic import name_pattern from pydbml.parser.blueprints import ReferenceBlueprint pp.ParserElement.set_default_whitespace_chars(' \t\r') @@ -80,17 +81,8 @@ def parse_ref_settings(s, loc, tok): ref_settings.set_parse_action(parse_ref_settings) -composite_name = ( - '(' + pp.White()[...] - - name + pp.White()[...] - + ( - pp.White()[...] + "," - + pp.White()[...] + name - + pp.White()[...] - )[...] - + ')' -) -name_or_composite = name | pp.Combine(composite_name) +composite_name = pp.Regex(fr'\(\s*{name_pattern}(\s*,\s*{name_pattern}\s*)*\s*\)') +name_or_composite = name | composite_name ref_cols = ( ( diff --git a/pydbml/definitions/table.py b/pydbml/definitions/table.py index aa0dfc9..57ff275 100644 --- a/pydbml/definitions/table.py +++ b/pydbml/definitions/table.py @@ -2,7 +2,7 @@ from pydbml.parser.blueprints import TableBlueprint from .column import table_column, table_column_with_properties -from .common import _, hex_color +from .common import _, hex_color_pattern from .common import _c from .common import end from .common import note @@ -17,7 +17,7 @@ header_color = ( pp.CaselessLiteral('headercolor:').suppress() + _ - - pp.Combine(hex_color)('header_color') + - pp.Regex(hex_color_pattern)('header_color') ) table_setting = _ + (note('note') | header_color) + _ table_settings = '[' + table_setting + (',' + table_setting)[...] + ']' diff --git a/pydbml/definitions/table_group.py b/pydbml/definitions/table_group.py index b8e5b16..b9d691d 100644 --- a/pydbml/definitions/table_group.py +++ b/pydbml/definitions/table_group.py @@ -1,24 +1,24 @@ import pyparsing as pp from pydbml.parser.blueprints import TableGroupBlueprint, NoteBlueprint -from .common import _, note, note_object, hex_color +from .common import _, note, note_object, hex_color_pattern from .common import _c from .common import end from .generic import name +from .generic import name_pattern pp.ParserElement.set_default_whitespace_chars(' \t\r') -table_name = pp.Combine(name + '.' + name) | name +table_name = pp.Regex(fr'{name_pattern}(\.{name_pattern})?') note_element = note | note_object tg_element = _ + (note_element('note') | table_name.set_results_name('items', list_all_matches=True)) + _ tg_body = tg_element[...] - tg_color = ( pp.CaselessLiteral('color:').suppress() + _ - - pp.Combine(hex_color)('color') + - pp.Regex(hex_color_pattern)('color') ) tg_setting = _ + (note('note') | tg_color) + _