示例#1
0
def makeGrammarExpressionFragment(
    finalGrammar: Grammar = [GrammarItem(r";",
                                         FragmentNewElement)]) -> Grammar:
    """
	Generate a grammar for an expression, it accepts the following format:
	type[(arg1, arg2, ...)] [contract];
	"""
    class ArgumentStart(FragmentNestedStart):
        nestedName = "argument"

    grammarValue = [
        GrammarItem(_regexprValue, Fragment, [
            GrammarItem(r",", FragmentNewElement),
            GrammarItem(r"\)", FragmentParentElement)
        ]),
        GrammarItem(_regexprType, Fragment, [
            GrammarItem(r",", FragmentNewElement),
            GrammarItem(r"\)", FragmentParentElement)
        ])
    ]

    return makeGrammarType([
        GrammarItem(r"\(", ArgumentStart, [
            GrammarItem(_regexprName + r"\s*=", Fragment, grammarValue),
            GrammarItem(r"\)", FragmentParentElement)
        ] + grammarValue),
        makeGrammarContracts(), finalGrammar
    ])
示例#2
0
def makeGrammarControlStop(fragment: typing.Type[Fragment],
	grammar: typing.Optional[typing.Union[Grammar, str]] = None) -> Grammar:
	return [
		GrammarItem(r"(?=%})", Fragment,
		[GrammarItem(r"%}([ \t]*\n[ \t]*(?={[%#])|[ \t]*\n|[. \t]*$)?", fragment, grammar)]),
		GrammarItem(r"(?=-%})", Fragment, [GrammarItem(r"-%}\s*", fragment, grammar)]),
	]
示例#3
0
    def makeNestedCategory(name: str) -> GrammarItem:
        class CategoryFragmentStart(FragmentNestedStart):
            nestedName = name

        return GrammarItem(
            name + r"(?=:)", FragmentParentElement,
            [GrammarItem(r":", CategoryFragmentStart, "nested")])
示例#4
0
def makeGrammarUse() -> Grammar:
    """
	Generate a grammar for use, it accepts the following format:
	use "path/to/file"
	"""
    return [
        GrammarItem(r"use", {"category": "use"},
                    [GrammarItem(_regexprString, FragmentNewElement)])
    ]
示例#5
0
def makeGrammarControlIf() -> Grammar:
	"""
	Generate the grammar for the if block.
	It matches the following:
		if condition %}
	"""
	return makeGrammarControlStart(r"if", [
		GrammarItem(None, {"category": "if"},
		[GrammarItem(_regexprCondition, Fragment, makeGrammarControlStop(FragmentNestedStart, "root"))])
	])
示例#6
0
def makeGrammarMethod() -> Grammar:
    """
	Generate a grammar for methods, it accepts the following format:
	method name([inputs...]) [contract] [-> returntype [contract]];
	"""
    class ArgumentStart(FragmentNestedStart):
        nestedName = "argument"

    return [
        GrammarItem(r"method", {"category": "method"}, [
            GrammarItem(_regexprName, Fragment, [
                GrammarItem(r"\(", ArgumentStart, [
                    makeGrammarVariable([
                        GrammarItem(r",", FragmentNewElement),
                        GrammarItem(r"\)", FragmentParentElement)
                    ]),
                    GrammarItem(r"\)", FragmentParentElement)
                ]),
                makeGrammarContracts(),
                GrammarItem(r"->", Fragment, [
                    makeGrammarType([
                        makeGrammarContracts(name="contract_return"),
                        GrammarItem(r";", FragmentNewElement)
                    ])
                ]),
                GrammarItem(r";", FragmentNewElement)
            ])
        ])
    ]
示例#7
0
def makeGrammarValue(fragment: typing.Dict[str, str], grammar: Grammar) -> Grammar:
	"""
	A value is either a name, a number or a string.
	"""
	return [
		GrammarItem(_regexprNumber, dict(fragment, type="number"), grammar),
		GrammarItem(_regexprString, dict(fragment, type="string"), grammar),
		GrammarItem(_regexprBooleanTrue, dict(fragment, type="true"), grammar),
		GrammarItem(_regexprBooleanFalse, dict(fragment, type="false"), grammar),
		GrammarItem(makeRegexprName("value"), dict(fragment, type="name"), grammar),
	]
示例#8
0
def makeGrammarVariable(
    finalGrammar: Grammar = [GrammarItem(r";",
                                         FragmentNewElement)]) -> Grammar:
    """
	Generate a grammar for Variables, it accepts the following format:
	name = type[(value)] [contract];
	"""

    return [
        GrammarItem(_regexprNameOrVarArgs + r"\s*=",
                    {"category": "expression"},
                    makeGrammarExpressionFragment(finalGrammar))
    ]
示例#9
0
def makeGrammarExpression() -> Grammar:
    """
	Generate a grammar for Variables, it accepts the following format:
	[name =] type[(value)] [contract];
	"""

    finalGrammar: Grammar = [GrammarItem(r";", FragmentNewElement)]

    return makeGrammarVariable(finalGrammar) + [
        GrammarItem(r"(?=" + _regexprBaseName + r")",
                    {"category": "expression"},
                    makeGrammarExpressionFragment(finalGrammar))
    ]
示例#10
0
def makeGrammarControlEnd() -> Grammar:
	"""
	Generate the grammar for the end control block.
	"""

	class FragmentEndElement(FragmentNewElement):
		default = {"category": "end"}

	return [
		GrammarItem(
		r"(?={%-?\s*end)", FragmentParentElement,
		makeGrammarControlStart(r"end",
		[GrammarItem(None, FragmentNewElement, makeGrammarControlStop(FragmentEndElement))]))
	]
示例#11
0
def makeGrammarContracts(name: str = "contract") -> Grammar:
    """
	Generate a grammar for Contracts, it accepts the following format:
	[Type1[(value1, value2, ...)], Type2[(value1, value2, ...)] ...]

	Nested type elements are included under `contracts`.
	"""
    class ContractStart(FragmentNestedStart):
        nestedName = name

    class ValuesStart(FragmentNestedStart):
        nestedName = "values"

    return [
        GrammarItem(r"\[", ContractStart, [
            GrammarItem(_regexprType, Fragment, [
                GrammarItem(r"\(", ValuesStart, [
                    GrammarItem(_regexprValue, Fragment, [
                        GrammarItem(r",", FragmentNewElement),
                        GrammarItem(r"\)", FragmentParentElement),
                    ]),
                ]),
                GrammarItem(r"\]", FragmentParentElement),
                GrammarItem(r"", FragmentNewElement),
            ])
        ]),
    ]
示例#12
0
def makeGrammarContent() -> Grammar:
	"""
	Generate a grammar for the raw content.
	"""

	class FragmentContent(FragmentNewElement):
		default = {"category": "content"}

	return [
		# Note the order is important here.
		GrammarItem(_regexprContentStripRight, FragmentContent),
		GrammarItem(_regexprContentStripAuto, FragmentContent),
		GrammarItem(_regexprContent, FragmentContent),
		GrammarItem(_regexprContentEndOfFile, FragmentContent)
	]
示例#13
0
def makeGrammarComments() -> Grammar:
	"""
	Generate the grammar code comments.
	"""

	return makeGrammarCommentStart(
		[GrammarItem(_regexprComment, {"category": "comment"}, makeGrammarCommentStop(FragmentNewElement))])
示例#14
0
def makeGrammarSubstitution() -> Grammar:
	"""
	Generate a grammar for substitution blocks.
	"""

	class PipeStart(FragmentNestedStart):
		nestedName = "pipe"

	return makeGrammarSubstitutionStart(
		makeGrammarSymbol({"category": "substitution"}, [
		GrammarItem(r"\|", PipeStart, [
		GrammarItem(makeRegexprName("name"), Fragment,
		[GrammarItem(r"\|", FragmentNewElement),
		GrammarItem(None, FragmentParentElement)])
		])
		] + makeGrammarSubstitutionStop(FragmentNewElement)) + makeGrammarSubstitutionStop(FragmentNewElement))
示例#15
0
def makeGrammarNamespace() -> Grammar:
    """
	Generate a grammar for namespace, it accepts the following format:
	namespace level1[.level2[.level3...]];
	"""
    class NamespaceStart(FragmentNestedStart):
        default = {"category": "namespace"}
        nestedName = "name"

    return [
        GrammarItem(r"namespace", NamespaceStart, [
            GrammarItem(_regexprName, Fragment, [
                GrammarItem(r"\.", FragmentNewElement),
                GrammarItem(r";", FragmentNestedStopNewElement)
            ])
        ])
    ]
示例#16
0
def makeGrammarControlElseIf() -> Grammar:
	"""
	Generate the grammar for the else / elif block.
	It matches the following:
		else %}
		elif condition %}
	"""

	class ElseFragment(FragmentNestedStart):
		default = {"category": "else"}

	return [
		GrammarItem(
		r"(?={%-?\s*(else|elif))", FragmentNestedStopNewElement,
		makeGrammarControlStart(r"elif",
		[GrammarItem(_regexprCondition, {"category": "else"}, makeGrammarControlStop(FragmentNestedStart, "root"))]) +
		makeGrammarControlStart(r"else", makeGrammarControlStop(ElseFragment, "root")))
	]
示例#17
0
def makeGrammarSymbol(fragment: typing.Dict[str, str], grammar: Grammar) -> Grammar:
	"""
	Generate a grammar for a symbol.
	A symbol is a entity that must be resolved from substitution.
	"""

	class ArgumentStart(FragmentNestedStart):
		nestedName = "argument"

	return [
		GrammarItem(makeRegexprName("name"), fragment, [
		GrammarItem(
		r"\(", ArgumentStart,
		makeGrammarValue({},
		[GrammarItem(r",", FragmentNewElement),
		GrammarItem(r"\)", FragmentParentElement, grammar)]) + [GrammarItem(r"\)", FragmentParentElement, grammar)])
		] + grammar)
	]
示例#18
0
def makeGrammarUsing() -> Grammar:
    """
	Generate a grammar for using keyword, it accepts the following format:
	using name = Type [contract];
	"""

    return [
        GrammarItem(r"using", {"category": "using"}, [
            GrammarItem(_regexprName, Fragment, [
                GrammarItem(
                    r"=", Fragment,
                    makeGrammarType([
                        makeGrammarContracts(),
                        GrammarItem(r";", FragmentNewElement)
                    ]))
            ])
        ])
    ]
示例#19
0
def makeGrammarControl() -> Grammar:
	"""
	Generate the grammar for all control blocks.
	"""

	return [
		GrammarItem(
		r"(?={%)", Fragment,
		makeGrammarControlFor() + makeGrammarControlIf() + makeGrammarControlElseIf() + makeGrammarControlMacro() +
		makeGrammarControlInclude() + makeGrammarControlEnd())
	]
示例#20
0
def makeGrammarControlMacro() -> Grammar:
	"""
	Generate the grammar for a macro block.
	It matches the following:
		macro name(arg1, arg2, ...) %}
	"""

	class ArgumentStart(FragmentNestedStart):
		nestedName = "argument"
		default = {"category": "macro"}

	return makeGrammarControlStart(r"macro", [
		GrammarItem(_regexprIdentifier + r"\(", ArgumentStart, [
		GrammarItem(makeRegexprName("name"), Fragment, [
		GrammarItem(r",", FragmentNewElement),
		GrammarItem(r"\)", FragmentParentElement, makeGrammarControlStop(FragmentNestedStart, "root"))
		]),
		GrammarItem(r"\)", FragmentParentElement, makeGrammarControlStop(FragmentNestedStart, "root"))
		])
	])
示例#21
0
def makeGrammarNested(nestedGrammar: Grammar,
                      trivial: bool = False) -> Grammar:
    """
	Generate a grammar for a nested entity, it accepst the following format:
	(interface|struct|component|composition) [name] [contracts] [: inheritance1, inheritance2, ...] {
		nestedGrammar
	}

	Nested type elements are included under `nested`.
	"""
    class InheritanceStart(FragmentNestedStart):
        nestedName = "inheritance"

    class NestedInterface(FragmentNestedStart):
        nestedName = "interface"

    def makeNestedCategory(name: str) -> GrammarItem:
        class CategoryFragmentStart(FragmentNestedStart):
            nestedName = name

        return GrammarItem(
            name + r"(?=:)", FragmentParentElement,
            [GrammarItem(r":", CategoryFragmentStart, "nested")])

    grammarAfterName: Grammar = [
        GrammarItem(r":", InheritanceStart, [
            GrammarItem(_regexprSymbol, Fragment, [
                GrammarItem(r",", FragmentNewElement),
                GrammarItem(r"(?={)", FragmentParentElement)
            ])
        ]),
        GrammarItem(
            r"{", NestedInterface, nestedGrammar + [
                makeNestedCategory("config"),
                makeNestedCategory("composition"),
                makeNestedCategory("interface"),
                GrammarItem(r"}", FragmentNestedStopNewElement),
            ], "nested"),
    ] + makeGrammarContracts()

    return [
        GrammarItem(_regexprNestedTrivial if trivial else _regexprNested,
                    {"category": "nested"},
                    [GrammarItem(_regexprName, Fragment, grammarAfterName)] +
                    grammarAfterName)
    ]
示例#22
0
def makeGrammarType(nextGrammar: Grammar) -> Grammar:
    """
	Generate a grammar for Type, it accepts the following format:
	Type = [const] Type1[<Type, Type, ...>]

	Nested type elements are included under `template`.
	"""
    class TemplateStart(FragmentNestedStart):
        nestedName = "template"

    grammar: Grammar = [GrammarItem(r"const", {"const": ""})]
    followUpGrammar: Grammar = [
        GrammarItem(r"<", TemplateStart, [grammar]),
        GrammarItem(r",", FragmentNewElement),
        GrammarItem(r">", FragmentParentElement), nextGrammar
    ]
    grammar.append(GrammarItem(_regexprValue, Fragment, followUpGrammar))
    grammar.append(GrammarItem(_regexprType, Fragment, followUpGrammar))
    return grammar
示例#23
0
def makeGrammarControlFor() -> Grammar:
	"""
	Generate the grammar for the for loop control block.
	It matches the following:
		for value1 [, value2] in iterable %}
	"""

	grammarFromIn = [
		GrammarItem(r"in", Fragment,
		[GrammarItem(makeRegexprName("iterable"), Fragment, makeGrammarControlStop(FragmentNestedStart, "root"))])
	]

	return makeGrammarControlStart(r"for", [
		GrammarItem(None, {"category": "for"}, [
		GrammarItem(makeRegexprName("value1"), Fragment,
		[GrammarItem(r",", Fragment, [GrammarItem(makeRegexprName("value2"), Fragment, grammarFromIn)])] +
		grammarFromIn)
		])
	])
示例#24
0
def makeGrammarEnum() -> Grammar:
    """
	Generate a grammar for an enum, it accepts the following format:
	enum name { VALUE1 [,VALUE2 [,...]] }
	"""
    class EnumStart(FragmentNestedStart):
        nestedName = "values"

    return [
        GrammarItem(r"enum", {"category": "enum"}, [
            GrammarItem(_regexprName, Fragment, [
                GrammarItem(r"{", EnumStart, [
                    GrammarItem(_regexprName, Fragment, [
                        GrammarItem(r",", FragmentNewElement),
                        GrammarItem(r"}", FragmentNestedStopNewElement),
                    ])
                ])
            ])
        ])
    ]
示例#25
0

def makeGrammarUse() -> Grammar:
    """
	Generate a grammar for use, it accepts the following format:
	use "path/to/file"
	"""
    return [
        GrammarItem(r"use", {"category": "use"},
                    [GrammarItem(_regexprString, FragmentNewElement)])
    ]


# Comments allowed by the grammar
_grammarComments = [
    GrammarItem(r"/\*(?P<comment>([\s\S]*?))\*/", FragmentBlockComment),
    GrammarItem(r"//(?P<comment>[^\n]*)", FragmentComment)
]


class Parser(ParserBase):
    def __init__(self, content: str) -> None:

        withinNested = makeGrammarUsing() + makeGrammarEnum(
        ) + makeGrammarExpression() + makeGrammarMethod()
        nested = withinNested + makeGrammarNested(
            withinNested + makeGrammarNested(withinNested + makeGrammarNested(
                withinNested +
                makeGrammarNested(withinNested + makeGrammarNested(
                    withinNested, trivial=True),
                                  trivial=True),
示例#26
0
def makeGrammarCommentStop(fragment: typing.Type[Fragment]) -> Grammar:
	return [
		GrammarItem(r"(?=#})", Fragment, [GrammarItem(r"#}([ \t]*\n[ \t]*(?={[%#])|[ \t]*\n|[. \t]*$)?", fragment)]),
		GrammarItem(r"(?=-#})", Fragment, [GrammarItem(r"-#}\s*", fragment)]),
	]
示例#27
0
def makeGrammarSubstitutionStop(fragment: typing.Type[Fragment]) -> Grammar:
	return [
		GrammarItem(r"(?=}})", Fragment, [GrammarItem(r"}}", fragment)]),
		GrammarItem(r"(?=-}})", Fragment, [GrammarItem(r"-}}\s*", fragment)]),
	]
示例#28
0
def makeGrammarCommentStart(grammar: Grammar) -> Grammar:
	return [
		GrammarItem(r"(^[ \t]*)?{#-?", Fragment, grammar),
	]
示例#29
0
def makeGrammarControlStart(keyword: str, grammar: Grammar) -> Grammar:
	return [
		GrammarItem(r"(^[ \t]*)?{%-?\s*" + keyword, Fragment, grammar),
	]
示例#30
0
def makeGrammarSubstitutionStart(grammar: Grammar) -> Grammar:
	return [GrammarItem(r"{{-?", Fragment, grammar)]