mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	* grammars: Update several grammars with compat issues * [WIP] Add new grammar conversion tools * Wrap in a Docker script * Proper Dockerfile support * Add Javadoc grammar * Remove NPM package.json * Remove superfluous test This is now always checked by the grammars compiler * Update JSyntax grammar to new submodule * Approve Javadoc license * grammars: Remove checked-in dependencies * grammars: Add regex checks to the compiler * grammars: Point Oz to its actual submodule * grammars: Refactor compiler to group errors by repo * grammars: Cleanups to error reporting
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package compiler
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
 | 
						|
	"github.com/github/linguist/tools/grammars/pcre"
 | 
						|
)
 | 
						|
 | 
						|
type replacement struct {
 | 
						|
	pos int
 | 
						|
	len int
 | 
						|
	val string
 | 
						|
}
 | 
						|
 | 
						|
func fixRegex(re string) (string, bool) {
 | 
						|
	var (
 | 
						|
		replace     []replacement
 | 
						|
		escape      = false
 | 
						|
		hasBackRefs = false
 | 
						|
	)
 | 
						|
 | 
						|
	for i, ch := range re {
 | 
						|
		if escape {
 | 
						|
			if ch == 'h' {
 | 
						|
				replace = append(replace, replacement{i - 1, 2, "[[:xdigit:]]"})
 | 
						|
			}
 | 
						|
			if '0' <= ch && ch <= '9' {
 | 
						|
				hasBackRefs = true
 | 
						|
			}
 | 
						|
		}
 | 
						|
		escape = !escape && ch == '\\'
 | 
						|
	}
 | 
						|
 | 
						|
	if len(replace) > 0 {
 | 
						|
		reb := []byte(re)
 | 
						|
		offset := 0
 | 
						|
		for _, repl := range replace {
 | 
						|
			reb = append(
 | 
						|
				reb[:offset+repl.pos],
 | 
						|
				append([]byte(repl.val), reb[offset+repl.pos+repl.len:]...)...)
 | 
						|
			offset += len(repl.val) - repl.len
 | 
						|
		}
 | 
						|
		return string(reb), hasBackRefs
 | 
						|
	}
 | 
						|
 | 
						|
	return re, hasBackRefs
 | 
						|
}
 | 
						|
 | 
						|
func CheckPCRE(re string) (string, error) {
 | 
						|
	hasBackRefs := false
 | 
						|
 | 
						|
	if re == "" {
 | 
						|
		return "", nil
 | 
						|
	}
 | 
						|
	if len(re) > 32*1024 {
 | 
						|
		return "", fmt.Errorf(
 | 
						|
			"regex %s: definition too long (%d bytes)",
 | 
						|
			pcre.RegexPP(re), len(re))
 | 
						|
	}
 | 
						|
 | 
						|
	re, hasBackRefs = fixRegex(re)
 | 
						|
	if !hasBackRefs {
 | 
						|
		if err := pcre.CheckRegexp(re, pcre.DefaultFlags); err != nil {
 | 
						|
			return "", err
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return re, nil
 | 
						|
}
 |