func (parser *Parser) ParseString() ast.Expr { if tok := parser.accept(ast.T_QQ_STRING); tok != nil { return ast.NewStringWithQuote('"', tok) } else if tok := parser.accept(ast.T_Q_STRING); tok != nil { return ast.NewStringWithQuote('\'', tok) } else if tok := parser.accept(ast.T_UNQUOTE_STRING); tok != nil { return ast.NewStringWithQuote(0, tok) } else if tok := parser.accept(ast.T_IDENT); tok != nil { return ast.NewStringWithToken(tok) } var tok = parser.peek() if tok.Type == ast.T_INTERPOLATION_START { return parser.ParseInterp() } return nil }
/** The ParseFactor must return an Expr interface compatible object */ func (parser *Parser) ParseFactor() ast.Expr { var tok = parser.peek() if tok.Type == ast.T_PAREN_OPEN { parser.expect(ast.T_PAREN_OPEN) var expr = parser.ParseExpr(true) parser.expect(ast.T_PAREN_CLOSE) return expr } else if tok.Type == ast.T_INTERPOLATION_START { return parser.ParseInterp() } else if tok.Type == ast.T_QQ_STRING { parser.advance() return ast.NewStringWithQuote('"', tok) } else if tok.Type == ast.T_Q_STRING { parser.advance() return ast.NewStringWithQuote('\'', tok) } else if tok.Type == ast.T_UNQUOTE_STRING { parser.advance() return ast.NewStringWithQuote(0, tok) } else if tok.Type == ast.T_TRUE { parser.advance() return ast.NewBooleanTrue(tok) } else if tok.Type == ast.T_FALSE { parser.advance() return ast.NewBooleanFalse(tok) } else if tok.Type == ast.T_NULL { parser.advance() return ast.NewNullWithToken(tok) } else if tok.Type == ast.T_FUNCTION_NAME { var fcall = parser.ParseFunctionCall() return ast.Expr(fcall) } else if tok.Type == ast.T_VARIABLE { return parser.ParseVariable() } else if tok.Type == ast.T_IDENT { var tok2 = parser.peekBy(2) if tok2 != nil && tok2.Type == ast.T_PAREN_OPEN { return parser.ParseFunctionCall() } parser.advance() return ast.NewStringWithToken(tok) } else if tok.Type == ast.T_HEX_COLOR { parser.advance() return ast.NewHexColorFromToken(tok) } else if tok.Type == ast.T_INTEGER || tok.Type == ast.T_FLOAT { return parser.ParseNumber() } return nil }