diff --git a/pkg/lexer/lexer.go b/pkg/lexer/lexer.go new file mode 100644 index 0000000..d493c41 --- /dev/null +++ b/pkg/lexer/lexer.go @@ -0,0 +1,28 @@ +package lexer + +import ( + "errors" + + "github.com/laytan/php-parser/internal/php7" + "github.com/laytan/php-parser/internal/php8" + "github.com/laytan/php-parser/pkg/conf" + "github.com/laytan/php-parser/pkg/token" +) + +var ErrVersionOutOfRange = errors.New("the version is out of supported range") + +type Lexer interface { + Lex() *token.Token +} + +func New(src []byte, config conf.Config) (Lexer, error) { + if config.Version.InPhp7Range() { + return php7.NewLexer(src, config), nil + } + + if config.Version.InPhp8Range() { + return php8.NewLexer(src, config), nil + } + + return nil, ErrVersionOutOfRange +} diff --git a/pkg/parser/parser.go b/pkg/parser/parser.go index 0b1c652..89f09bc 100644 --- a/pkg/parser/parser.go +++ b/pkg/parser/parser.go @@ -10,16 +10,8 @@ import ( "github.com/laytan/php-parser/pkg/version" ) -var ( - // ErrVersionOutOfRange is returned if the version is not supported - ErrVersionOutOfRange = errors.New("the version is out of supported range") - - php7RangeStart = &version.Version{Major: 7} - php7RangeEnd = &version.Version{Major: 7, Minor: 4} - - php8RangeStart = &version.Version{Major: 8} - php8RangeEnd = &version.Version{Major: 8, Minor: 2} -) +// ErrVersionOutOfRange is returned if the version is not supported +var ErrVersionOutOfRange = errors.New("the version is out of supported range") // Parser interface type Parser interface { @@ -31,17 +23,17 @@ func Parse(src []byte, config conf.Config) (ast.Vertex, error) { var parser Parser if config.Version == nil { - config.Version = php7RangeEnd + config.Version = &version.Version{Major: 7, Minor: 4} } - if config.Version.InRange(php7RangeStart, php7RangeEnd) { + if config.Version.InPhp7Range() { lexer := php7.NewLexer(src, config) parser = php7.NewParser(lexer, config) parser.Parse() return parser.GetRootNode(), nil } - if config.Version.InRange(php8RangeStart, php8RangeEnd) { + if config.Version.InPhp8Range() { lexer := php8.NewLexer(src, config) parser = php8.NewParser(lexer, config) parser.Parse() diff --git a/pkg/version/version.go b/pkg/version/version.go index c6fa627..4dfad93 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -81,6 +81,14 @@ func (v *Version) InRange(s, e *Version) bool { return v.Compare(s) >= 0 && v.Compare(e) <= 0 } +func (v *Version) InPhp7Range() bool { + return v.InRange(php7RangeStart, php7RangeEnd) +} + +func (v *Version) InPhp8Range() bool { + return v.InRange(php8RangeStart, php8RangeEnd) +} + // Compare compares this version to another one. It returns -1, 0, or 1 if // the version smaller, equal, or larger than the other version. func (v *Version) Compare(o *Version) int {