alecthomas/participle

possible bug in tag syntax

marco-m opened this issue · 3 comments

Hello,

it seems there is a difference between the "raw" and "parse" tag syntax? The following repro shows what I stumbled upon.

package tagsyntax

import (
	"testing"

	"github.com/alecthomas/assert/v2"
	"github.com/alecthomas/participle/v2"
)

type GoodAST struct {
	Key        string   `parser:"@Ident '='"`
	BlankLines []string `"\n"`
}

type BadAST struct {
	Key string `parser:"@Ident '='"`
	// Same as field in GoodAST, as explained in https://github.com/alecthomas/participle#tag-syntax
	BlankLines []string `parser:"'\n'"`
}

func TestLiteralNotTerminatedGood(t *testing.T) {
	_, err := participle.Build(&GoodAST{})

	assert.NoError(t, err)
}

func TestLiteralNotTerminatedBad(t *testing.T) {
	_, err := participle.Build(&BadAST{})

	// The error is:
	//
	//     Key: <input>:1:2: literal not terminated
	//
	// which is confusing because it refers to the previous field in the struct (Key)
	// and unclear?
	assert.NoError(t, err)
}

It's a bit unclear, what's the bug? That it's not correctly decoding an escaped \n?

I receive the same error. When is declared the field tag with parser:"'\n'" raises the error literal not terminated. Change it to '\n' works.

I think this is because '\n' is currently lexed by text/scanner, which does not support single escape sequences in single quotes.