diff --git a/smnp/ast/node/type.py b/smnp/ast/node/type.py index d2a07d1..4612f09 100644 --- a/smnp/ast/node/type.py +++ b/smnp/ast/node/type.py @@ -42,13 +42,6 @@ class TypeNode(AccessNode): @classmethod def _parse(cls, input): - return Parser.oneOf( - cls._specifiedTypeParser(), - cls._rawTypeParser() - )(input) - - @classmethod - def _specifiedTypeParser(cls): def createNode(type, specifier): node = TypeNode(type.pos) node.type = type.value @@ -57,9 +50,9 @@ class TypeNode(AccessNode): return Parser.allOf( cls._rawTypeParser(), - TypeSpecifier.parse, + Parser.optional(TypeSpecifier.parse), createNode=createNode - ) + )(input) @classmethod def _rawTypeParser(cls): diff --git a/smnp/ast/parser.py b/smnp/ast/parser.py index 96198f3..746cc66 100644 --- a/smnp/ast/parser.py +++ b/smnp/ast/parser.py @@ -1,5 +1,6 @@ from smnp.ast.node.ignore import IgnoredNode from smnp.ast.node.model import ParseResult, Node +from smnp.ast.node.none import NoneNode from smnp.error.syntax import SyntaxException @@ -139,3 +140,14 @@ class Parser: return result return parse + + @staticmethod + def optional(parser): + def parse(input): + result = parser(input) + if result.result: + return result + + return ParseResult.OK(NoneNode()) + + return parse