mirror of
				https://github.com/prometheus/prometheus.git
				synced 2025-11-04 02:11:01 +01:00 
			
		
		
		
	This adds support for the new grammar of `{"metric_name", "l1"="val"}` to promql and some of the exposition formats.
This grammar will also be valid for non-UTF-8 names.
UTF-8 names will not be considered valid unless model.NameValidationScheme is changed.
This does not update the go expfmt parser in text_parse.go, which will be addressed by https://github.com/prometheus/common/issues/554/.
Part of https://github.com/prometheus/prometheus/issues/13095
Signed-off-by: Owen Williams <owen.williams@grafana.com>
		
	
			
		
			
				
	
	
		
			657 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			657 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Code generated by golex. DO NOT EDIT.
 | 
						|
 | 
						|
// Copyright 2017 The Prometheus Authors
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
// http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
package textparse
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	sInit = iota
 | 
						|
	sComment
 | 
						|
	sMeta1
 | 
						|
	sMeta2
 | 
						|
	sLabels
 | 
						|
	sLValue
 | 
						|
	sValue
 | 
						|
	sTimestamp
 | 
						|
	sExemplar
 | 
						|
	sEValue
 | 
						|
	sETimestamp
 | 
						|
)
 | 
						|
 | 
						|
// Lex is called by the parser generated by "go tool yacc" to obtain each
 | 
						|
// token. The method is opened before the matching rules block and closed at
 | 
						|
// the end of the file.
 | 
						|
func (l *promlexer) Lex() token {
 | 
						|
	if l.i >= len(l.b) {
 | 
						|
		return tEOF
 | 
						|
	}
 | 
						|
	c := l.b[l.i]
 | 
						|
	l.start = l.i
 | 
						|
 | 
						|
yystate0:
 | 
						|
 | 
						|
	switch yyt := l.state; yyt {
 | 
						|
	default:
 | 
						|
		panic(fmt.Errorf(`invalid start condition %d`, yyt))
 | 
						|
	case 0: // start condition: INITIAL
 | 
						|
		goto yystart1
 | 
						|
	case 1: // start condition: sComment
 | 
						|
		goto yystart9
 | 
						|
	case 2: // start condition: sMeta1
 | 
						|
		goto yystart20
 | 
						|
	case 3: // start condition: sMeta2
 | 
						|
		goto yystart25
 | 
						|
	case 4: // start condition: sLabels
 | 
						|
		goto yystart28
 | 
						|
	case 5: // start condition: sLValue
 | 
						|
		goto yystart36
 | 
						|
	case 6: // start condition: sValue
 | 
						|
		goto yystart40
 | 
						|
	case 7: // start condition: sTimestamp
 | 
						|
		goto yystart43
 | 
						|
	}
 | 
						|
 | 
						|
yystate1:
 | 
						|
	c = l.next()
 | 
						|
yystart1:
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '#':
 | 
						|
		goto yystate5
 | 
						|
	case c == ':' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | 
						|
		goto yystate7
 | 
						|
	case c == '\n':
 | 
						|
		goto yystate4
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate3
 | 
						|
	case c == '\x00':
 | 
						|
		goto yystate2
 | 
						|
	case c == '{':
 | 
						|
		goto yystate8
 | 
						|
	}
 | 
						|
 | 
						|
yystate2:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule1
 | 
						|
 | 
						|
yystate3:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule3
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate3
 | 
						|
	}
 | 
						|
 | 
						|
yystate4:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule2
 | 
						|
 | 
						|
yystate5:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule5
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate6
 | 
						|
	}
 | 
						|
 | 
						|
yystate6:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule4
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate6
 | 
						|
	}
 | 
						|
 | 
						|
yystate7:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule11
 | 
						|
	case c >= '0' && c <= ':' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | 
						|
		goto yystate7
 | 
						|
	}
 | 
						|
 | 
						|
yystate8:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule13
 | 
						|
 | 
						|
yystate9:
 | 
						|
	c = l.next()
 | 
						|
yystart9:
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == 'H':
 | 
						|
		goto yystate10
 | 
						|
	case c == 'T':
 | 
						|
		goto yystate15
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate3
 | 
						|
	}
 | 
						|
 | 
						|
yystate10:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == 'E':
 | 
						|
		goto yystate11
 | 
						|
	}
 | 
						|
 | 
						|
yystate11:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == 'L':
 | 
						|
		goto yystate12
 | 
						|
	}
 | 
						|
 | 
						|
yystate12:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == 'P':
 | 
						|
		goto yystate13
 | 
						|
	}
 | 
						|
 | 
						|
yystate13:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate14
 | 
						|
	}
 | 
						|
 | 
						|
yystate14:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule6
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate14
 | 
						|
	}
 | 
						|
 | 
						|
yystate15:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == 'Y':
 | 
						|
		goto yystate16
 | 
						|
	}
 | 
						|
 | 
						|
yystate16:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == 'P':
 | 
						|
		goto yystate17
 | 
						|
	}
 | 
						|
 | 
						|
yystate17:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == 'E':
 | 
						|
		goto yystate18
 | 
						|
	}
 | 
						|
 | 
						|
yystate18:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate19
 | 
						|
	}
 | 
						|
 | 
						|
yystate19:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule7
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate19
 | 
						|
	}
 | 
						|
 | 
						|
yystate20:
 | 
						|
	c = l.next()
 | 
						|
yystart20:
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '"':
 | 
						|
		goto yystate21
 | 
						|
	case c == ':' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | 
						|
		goto yystate24
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate3
 | 
						|
	}
 | 
						|
 | 
						|
yystate21:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '"':
 | 
						|
		goto yystate22
 | 
						|
	case c == '\\':
 | 
						|
		goto yystate23
 | 
						|
	case c >= '\x01' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= 'ÿ':
 | 
						|
		goto yystate21
 | 
						|
	}
 | 
						|
 | 
						|
yystate22:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule8
 | 
						|
 | 
						|
yystate23:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ':
 | 
						|
		goto yystate21
 | 
						|
	}
 | 
						|
 | 
						|
yystate24:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule9
 | 
						|
	case c >= '0' && c <= ':' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | 
						|
		goto yystate24
 | 
						|
	}
 | 
						|
 | 
						|
yystate25:
 | 
						|
	c = l.next()
 | 
						|
yystart25:
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule10
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate27
 | 
						|
	case c >= '\x01' && c <= '\b' || c >= '\v' && c <= '\x1f' || c >= '!' && c <= 'ÿ':
 | 
						|
		goto yystate26
 | 
						|
	}
 | 
						|
 | 
						|
yystate26:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule10
 | 
						|
	case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ':
 | 
						|
		goto yystate26
 | 
						|
	}
 | 
						|
 | 
						|
yystate27:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule3
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate27
 | 
						|
	case c >= '\x01' && c <= '\b' || c >= '\v' && c <= '\x1f' || c >= '!' && c <= 'ÿ':
 | 
						|
		goto yystate26
 | 
						|
	}
 | 
						|
 | 
						|
yystate28:
 | 
						|
	c = l.next()
 | 
						|
yystart28:
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '"':
 | 
						|
		goto yystate29
 | 
						|
	case c == ',':
 | 
						|
		goto yystate32
 | 
						|
	case c == '=':
 | 
						|
		goto yystate33
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate3
 | 
						|
	case c == '}':
 | 
						|
		goto yystate35
 | 
						|
	case c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | 
						|
		goto yystate34
 | 
						|
	}
 | 
						|
 | 
						|
yystate29:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '"':
 | 
						|
		goto yystate30
 | 
						|
	case c == '\\':
 | 
						|
		goto yystate31
 | 
						|
	case c >= '\x01' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= 'ÿ':
 | 
						|
		goto yystate29
 | 
						|
	}
 | 
						|
 | 
						|
yystate30:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule15
 | 
						|
 | 
						|
yystate31:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ':
 | 
						|
		goto yystate29
 | 
						|
	}
 | 
						|
 | 
						|
yystate32:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule18
 | 
						|
 | 
						|
yystate33:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule17
 | 
						|
 | 
						|
yystate34:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule14
 | 
						|
	case c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c == '_' || c >= 'a' && c <= 'z':
 | 
						|
		goto yystate34
 | 
						|
	}
 | 
						|
 | 
						|
yystate35:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule16
 | 
						|
 | 
						|
yystate36:
 | 
						|
	c = l.next()
 | 
						|
yystart36:
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '"':
 | 
						|
		goto yystate37
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate3
 | 
						|
	}
 | 
						|
 | 
						|
yystate37:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '"':
 | 
						|
		goto yystate38
 | 
						|
	case c == '\\':
 | 
						|
		goto yystate39
 | 
						|
	case c >= '\x01' && c <= '!' || c >= '#' && c <= '[' || c >= ']' && c <= 'ÿ':
 | 
						|
		goto yystate37
 | 
						|
	}
 | 
						|
 | 
						|
yystate38:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule19
 | 
						|
 | 
						|
yystate39:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c >= '\x01' && c <= '\t' || c >= '\v' && c <= 'ÿ':
 | 
						|
		goto yystate37
 | 
						|
	}
 | 
						|
 | 
						|
yystate40:
 | 
						|
	c = l.next()
 | 
						|
yystart40:
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate3
 | 
						|
	case c == '{':
 | 
						|
		goto yystate42
 | 
						|
	case c >= '\x01' && c <= '\b' || c >= '\v' && c <= '\x1f' || c >= '!' && c <= 'z' || c >= '|' && c <= 'ÿ':
 | 
						|
		goto yystate41
 | 
						|
	}
 | 
						|
 | 
						|
yystate41:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule20
 | 
						|
	case c >= '\x01' && c <= '\b' || c >= '\v' && c <= '\x1f' || c >= '!' && c <= 'z' || c >= '|' && c <= 'ÿ':
 | 
						|
		goto yystate41
 | 
						|
	}
 | 
						|
 | 
						|
yystate42:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule12
 | 
						|
 | 
						|
yystate43:
 | 
						|
	c = l.next()
 | 
						|
yystart43:
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyabort
 | 
						|
	case c == '\n':
 | 
						|
		goto yystate44
 | 
						|
	case c == '\t' || c == ' ':
 | 
						|
		goto yystate3
 | 
						|
	case c >= '0' && c <= '9':
 | 
						|
		goto yystate45
 | 
						|
	}
 | 
						|
 | 
						|
yystate44:
 | 
						|
	c = l.next()
 | 
						|
	goto yyrule22
 | 
						|
 | 
						|
yystate45:
 | 
						|
	c = l.next()
 | 
						|
	switch {
 | 
						|
	default:
 | 
						|
		goto yyrule21
 | 
						|
	case c >= '0' && c <= '9':
 | 
						|
		goto yystate45
 | 
						|
	}
 | 
						|
 | 
						|
yyrule1: // \0
 | 
						|
	{
 | 
						|
		return tEOF
 | 
						|
	}
 | 
						|
yyrule2: // \n
 | 
						|
	{
 | 
						|
		l.state = sInit
 | 
						|
		return tLinebreak
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule3: // [ \t]+
 | 
						|
	{
 | 
						|
		return tWhitespace
 | 
						|
	}
 | 
						|
yyrule4: // #[ \t]+
 | 
						|
	{
 | 
						|
		l.state = sComment
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule5: // #
 | 
						|
	{
 | 
						|
		return l.consumeComment()
 | 
						|
	}
 | 
						|
yyrule6: // HELP[\t ]+
 | 
						|
	{
 | 
						|
		l.state = sMeta1
 | 
						|
		return tHelp
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule7: // TYPE[\t ]+
 | 
						|
	{
 | 
						|
		l.state = sMeta1
 | 
						|
		return tType
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule8: // \"(\\.|[^\\"])*\"
 | 
						|
	{
 | 
						|
		l.state = sMeta2
 | 
						|
		return tMName
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule9: // {M}({M}|{D})*
 | 
						|
	{
 | 
						|
		l.state = sMeta2
 | 
						|
		return tMName
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule10: // {C}*
 | 
						|
	{
 | 
						|
		l.state = sInit
 | 
						|
		return tText
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule11: // {M}({M}|{D})*
 | 
						|
	{
 | 
						|
		l.state = sValue
 | 
						|
		return tMName
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule12: // \{
 | 
						|
	{
 | 
						|
		l.state = sLabels
 | 
						|
		return tBraceOpen
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule13: // \{
 | 
						|
	{
 | 
						|
		l.state = sLabels
 | 
						|
		return tBraceOpen
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule14: // {L}({L}|{D})*
 | 
						|
	{
 | 
						|
		return tLName
 | 
						|
	}
 | 
						|
yyrule15: // \"(\\.|[^\\"])*\"
 | 
						|
	{
 | 
						|
		l.state = sLabels
 | 
						|
		return tQString
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule16: // \}
 | 
						|
	{
 | 
						|
		l.state = sValue
 | 
						|
		return tBraceClose
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule17: // =
 | 
						|
	{
 | 
						|
		l.state = sLValue
 | 
						|
		return tEqual
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule18: // ,
 | 
						|
	{
 | 
						|
		return tComma
 | 
						|
	}
 | 
						|
yyrule19: // \"(\\.|[^\\"])*\"
 | 
						|
	{
 | 
						|
		l.state = sLabels
 | 
						|
		return tLValue
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule20: // [^{ \t\n]+
 | 
						|
	{
 | 
						|
		l.state = sTimestamp
 | 
						|
		return tValue
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
yyrule21: // {D}+
 | 
						|
	{
 | 
						|
		return tTimestamp
 | 
						|
	}
 | 
						|
yyrule22: // \n
 | 
						|
	if true { // avoid go vet determining the below panic will not be reached
 | 
						|
		l.state = sInit
 | 
						|
		return tLinebreak
 | 
						|
		goto yystate0
 | 
						|
	}
 | 
						|
	panic("unreachable")
 | 
						|
 | 
						|
yyabort: // no lexem recognized
 | 
						|
	// silence unused label errors for build and satisfy go vet reachability analysis
 | 
						|
	{
 | 
						|
		if false {
 | 
						|
			goto yyabort
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate0
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate1
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate9
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate20
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate25
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate28
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate36
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate40
 | 
						|
		}
 | 
						|
		if false {
 | 
						|
			goto yystate43
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// Workaround to gobble up comments that started with a HELP or TYPE
 | 
						|
	// prefix. We just consume all characters until we reach a newline.
 | 
						|
	// This saves us from adding disproportionate complexity to the parser.
 | 
						|
	if l.state == sComment {
 | 
						|
		return l.consumeComment()
 | 
						|
	}
 | 
						|
	return tInvalid
 | 
						|
}
 | 
						|
 | 
						|
func (l *promlexer) consumeComment() token {
 | 
						|
	for c := l.cur(); ; c = l.next() {
 | 
						|
		switch c {
 | 
						|
		case 0:
 | 
						|
			return tEOF
 | 
						|
		case '\n':
 | 
						|
			l.state = sInit
 | 
						|
			return tComment
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |