issue #8: php5 and php7 package refactoring

This commit is contained in:
z7zmey 2018-04-10 00:52:38 +03:00
parent ac135f132d
commit 343896d019
9 changed files with 3840 additions and 3749 deletions

14
main.go
View File

@ -36,9 +36,19 @@ func main() {
src, _ := os.Open(string(path))
if *usePhp5 {
nodes, comments, positions, errors = php5.Parse(src, path)
parser := php5.NewParser(src, path)
parser.Parse()
nodes = parser.GetRootNode()
errors = parser.GetErrors()
comments = parser.GetComments()
positions = parser.GetPositions()
} else {
nodes, comments, positions, errors = php7.Parse(src, path)
parser := php7.NewParser(src, path)
parser.Parse()
nodes = parser.GetRootNode()
errors = parser.GetErrors()
comments = parser.GetComments()
positions = parser.GetPositions()
}
for _, e := range errors {

View File

@ -1,55 +0,0 @@
package php5
import (
"bufio"
goToken "go/token"
"io"
"github.com/cznic/golex/lex"
"github.com/z7zmey/php-parser/errors"
"github.com/z7zmey/php-parser/scanner"
"github.com/z7zmey/php-parser/token"
)
type lexer struct {
scanner.Lexer
lastToken *token.Token
errors []*errors.Error
}
func (l *lexer) Lex(lval *yySymType) int {
t := l.Lexer.Lex(lval)
l.lastToken = &lval.token
return t
}
func (l *lexer) Error(msg string) {
l.errors = append(l.errors, errors.NewError(msg, *l.lastToken))
}
func (lval *yySymType) Token(t token.Token) {
lval.token = t
}
func newLexer(src io.Reader, fName string) *lexer {
file := goToken.NewFileSet().AddFile(fName, -1, 1<<31-1)
lx, err := lex.New(file, bufio.NewReader(src), lex.RuneClass(scanner.Rune2Class))
if err != nil {
panic(err)
}
scanner := scanner.Lexer{
Lexer: lx,
StateStack: []int{0},
PhpDocComment: "",
Comments: nil,
}
return &lexer{
scanner,
nil,
nil,
}
}

View File

@ -1,72 +1,117 @@
// Package php5 parses PHP5
package php5
import (
"bufio"
goToken "go/token"
"io"
"github.com/z7zmey/php-parser/errors"
"github.com/z7zmey/php-parser/node/expr"
"github.com/cznic/golex/lex"
"github.com/z7zmey/php-parser/comment"
"github.com/z7zmey/php-parser/errors"
"github.com/z7zmey/php-parser/node"
"github.com/z7zmey/php-parser/node/stmt"
"github.com/z7zmey/php-parser/position"
"github.com/z7zmey/php-parser/scanner"
"github.com/z7zmey/php-parser/token"
)
var rootnode node.Node
var comments comment.Comments
var positions position.Positions
var positionBuilder position.Builder
var parentNode node.Node
// Parse the php5 parser entrypoint
func Parse(src io.Reader, fName string) (node.Node, comment.Comments, position.Positions, []*errors.Error) {
yyDebug = 0
yyErrorVerbose = true
rootnode = stmt.NewStmtList([]node.Node{}) //reset
comments = comment.Comments{}
positions = position.Positions{}
positionBuilder = position.Builder{Positions: &positions}
lexer := newLexer(src, fName)
yyParse(lexer)
return rootnode, comments, positions, lexer.errors
func (lval *yySymType) Token(t token.Token) {
lval.token = t
}
// ListGetFirstNodeComments returns comments of a first node in the list
func ListGetFirstNodeComments(list []node.Node) []comment.Comment {
// Parser structure
type Parser struct {
scanner.Lexer
lastToken *token.Token
positionBuilder *position.Builder
errors []*errors.Error
rootNode node.Node
comments comment.Comments
positions position.Positions
}
// NewParser creates and returns new Parser
func NewParser(src io.Reader, fName string) *Parser {
file := goToken.NewFileSet().AddFile(fName, -1, 1<<31-1)
lx, err := lex.New(file, bufio.NewReader(src), lex.RuneClass(scanner.Rune2Class))
if err != nil {
panic(err)
}
scanner := scanner.Lexer{
Lexer: lx,
StateStack: []int{0},
PhpDocComment: "",
Comments: nil,
}
return &Parser{
scanner,
nil,
nil,
nil,
nil,
nil,
nil,
}
}
// Lex proxy to lexer Lex
func (l *Parser) Lex(lval *yySymType) int {
t := l.Lexer.Lex(lval)
l.lastToken = &lval.token
return t
}
func (l *Parser) Error(msg string) {
l.errors = append(l.errors, errors.NewError(msg, *l.lastToken))
}
// Parse the php7 Parser entrypoint
func (l *Parser) Parse() int {
yyDebug = 0
yyErrorVerbose = true
// init
l.errors = nil
l.rootNode = nil
l.comments = comment.Comments{}
l.positions = position.Positions{}
l.positionBuilder = &position.Builder{
Positions: &l.positions,
}
// parse
return yyParse(l)
}
func (l *Parser) listGetFirstNodeComments(list []node.Node) []comment.Comment {
if len(list) == 0 {
return nil
}
node := list[0]
return comments[node]
return l.comments[node]
}
type foreachVariable struct {
node node.Node
byRef bool
// GetRootNode returns root node
func (l *Parser) GetRootNode() node.Node {
return l.rootNode
}
type nodesWithEndToken struct {
nodes []node.Node
endToken token.Token
// GetErrors returns errors list
func (l *Parser) GetErrors() []*errors.Error {
return l.errors
}
type boolWithToken struct {
value bool
token *token.Token
// GetComments returns comments list
func (l *Parser) GetComments() comment.Comments {
return l.comments
}
type simpleIndirectReference struct {
all []*expr.Variable
last *expr.Variable
}
type altSyntaxNode struct {
node node.Node
isAlt bool
// GetPositions returns positions list
func (l *Parser) GetPositions() position.Positions {
return l.positions
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,55 +0,0 @@
package php7
import (
"bufio"
goToken "go/token"
"io"
"github.com/cznic/golex/lex"
"github.com/z7zmey/php-parser/errors"
"github.com/z7zmey/php-parser/scanner"
"github.com/z7zmey/php-parser/token"
)
type lexer struct {
scanner.Lexer
lastToken *token.Token
errors []*errors.Error
}
func (l *lexer) Lex(lval *yySymType) int {
t := l.Lexer.Lex(lval)
l.lastToken = &lval.token
return t
}
func (l *lexer) Error(msg string) {
l.errors = append(l.errors, errors.NewError(msg, *l.lastToken))
}
func (lval *yySymType) Token(t token.Token) {
lval.token = t
}
func newLexer(src io.Reader, fName string) *lexer {
file := goToken.NewFileSet().AddFile(fName, -1, 1<<31-1)
lx, err := lex.New(file, bufio.NewReader(src), lex.RuneClass(scanner.Rune2Class))
if err != nil {
panic(err)
}
scanner := scanner.Lexer{
Lexer: lx,
StateStack: []int{0},
PhpDocComment: "",
Comments: nil,
}
return &lexer{
scanner,
nil,
nil,
}
}

View File

@ -1,63 +1,117 @@
// Package php7 parses PHP7
package php7
import (
"bufio"
goToken "go/token"
"io"
"github.com/cznic/golex/lex"
"github.com/z7zmey/php-parser/comment"
"github.com/z7zmey/php-parser/errors"
"github.com/z7zmey/php-parser/node"
"github.com/z7zmey/php-parser/node/stmt"
"github.com/z7zmey/php-parser/position"
"github.com/z7zmey/php-parser/scanner"
"github.com/z7zmey/php-parser/token"
)
var rootnode node.Node
var comments comment.Comments
var positions position.Positions
var positionBuilder position.Builder
// Parse the php7 parser entrypoint
func Parse(src io.Reader, fName string) (node.Node, comment.Comments, position.Positions, []*errors.Error) {
yyDebug = 0
yyErrorVerbose = true
rootnode = stmt.NewStmtList([]node.Node{}) //reset
comments = comment.Comments{}
positions = position.Positions{}
positionBuilder = position.Builder{&positions}
lexer := newLexer(src, fName)
yyParse(lexer)
return rootnode, comments, positions, lexer.errors
func (lval *yySymType) Token(t token.Token) {
lval.token = t
}
// ListGetFirstNodeComments returns comments of a first node in the list
func ListGetFirstNodeComments(list []node.Node) []comment.Comment {
// Parser structure
type Parser struct {
scanner.Lexer
lastToken *token.Token
positionBuilder *position.Builder
errors []*errors.Error
rootNode node.Node
comments comment.Comments
positions position.Positions
}
// NewParser creates and returns new Parser
func NewParser(src io.Reader, fName string) *Parser {
file := goToken.NewFileSet().AddFile(fName, -1, 1<<31-1)
lx, err := lex.New(file, bufio.NewReader(src), lex.RuneClass(scanner.Rune2Class))
if err != nil {
panic(err)
}
scanner := scanner.Lexer{
Lexer: lx,
StateStack: []int{0},
PhpDocComment: "",
Comments: nil,
}
return &Parser{
scanner,
nil,
nil,
nil,
nil,
nil,
nil,
}
}
// Lex proxy to lexer Lex
func (l *Parser) Lex(lval *yySymType) int {
t := l.Lexer.Lex(lval)
l.lastToken = &lval.token
return t
}
func (l *Parser) Error(msg string) {
l.errors = append(l.errors, errors.NewError(msg, *l.lastToken))
}
// Parse the php7 Parser entrypoint
func (l *Parser) Parse() int {
yyDebug = 0
yyErrorVerbose = true
// init
l.errors = nil
l.rootNode = nil
l.comments = comment.Comments{}
l.positions = position.Positions{}
l.positionBuilder = &position.Builder{
Positions: &l.positions,
}
// parse
return yyParse(l)
}
func (l *Parser) listGetFirstNodeComments(list []node.Node) []comment.Comment {
if len(list) == 0 {
return nil
}
node := list[0]
return comments[node]
return l.comments[node]
}
type foreachVariable struct {
node node.Node
byRef bool
// GetRootNode returns root node
func (l *Parser) GetRootNode() node.Node {
return l.rootNode
}
type nodesWithEndToken struct {
nodes []node.Node
endToken token.Token
// GetErrors returns errors list
func (l *Parser) GetErrors() []*errors.Error {
return l.errors
}
type boolWithToken struct {
value bool
token *token.Token
// GetComments returns comments list
func (l *Parser) GetComments() comment.Comments {
return l.comments
}
type altSyntaxNode struct {
node node.Node
isAlt bool
// GetPositions returns positions list
func (l *Parser) GetPositions() position.Positions {
return l.positions
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff