mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			146 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
 | 
						|
// `%nonassoc` tells the parser compiler (JISON) that these tokens cannot occur more than once,
 | 
						|
// i.e. input like '//a' (tokens '/', '/' and 'a') is not a legal input while '/a' (tokens '/' and 'a')
 | 
						|
// *is* legal input for this grammar.
 | 
						|
 
 | 
						|
%nonassoc '/' '/!'
 | 
						|
 | 
						|
// Likewise for `%left`: this informs the LALR(1) grammar compiler (JISON) that these tokens
 | 
						|
// *can* occur repeatedly, e.g. 'a?*' and even 'a**' are considered legal inputs given this
 | 
						|
// grammar!
 | 
						|
//
 | 
						|
// Token `RANGE_REGEX` may seem the odd one out here but really isn't: given the `regex_base`
 | 
						|
// choice/rule `regex_base range_regex`, which is recursive, this grammar tells JISON that 
 | 
						|
// any input matching a sequence like `regex_base range_regex range_regex` *is* legal.
 | 
						|
// If you do not want that to be legal, you MUST adjust the grammar rule set you match your
 | 
						|
// actual intent.
 | 
						|
 | 
						|
%left '*' '+' '?' RANGE_REGEX
 | 
						|
 | 
						|
 | 
						|
%% 
 | 
						|
 | 
						|
lex 
 | 
						|
    : definitions include '%%' rules '%%' EOF
 | 
						|
        {{ $$ = {macros: $1, rules: $4};
 | 
						|
          if ($2) $$.actionInclude = $2;
 | 
						|
          return $$; }}
 | 
						|
    | definitions include '%%' rules EOF
 | 
						|
        {{ $$ = {macros: $1, rules: $4};
 | 
						|
          if ($2) $$.actionInclude = $2;
 | 
						|
          return $$; }}
 | 
						|
    ;
 | 
						|
 | 
						|
include
 | 
						|
    : action
 | 
						|
    |
 | 
						|
    ;
 | 
						|
 | 
						|
definitions
 | 
						|
    : definitions definition
 | 
						|
        { $$ = $1; $$.concat($2); }
 | 
						|
    | definition
 | 
						|
        { $$ = [$1]; }
 | 
						|
    ;
 | 
						|
 | 
						|
definition
 | 
						|
    : name regex
 | 
						|
        { $$ = [$1, $2]; }
 | 
						|
    ;
 | 
						|
 | 
						|
name
 | 
						|
    : NAME
 | 
						|
        { $$ = yytext; }
 | 
						|
    ;
 | 
						|
 | 
						|
rules
 | 
						|
    : rules rule
 | 
						|
        { $$ = $1; $$.push($2); }
 | 
						|
    | rule
 | 
						|
        { $$ = [$1]; }
 | 
						|
    ;
 | 
						|
 | 
						|
rule
 | 
						|
    : regex action
 | 
						|
        { $$ = [$1, $2]; }
 | 
						|
    ;
 | 
						|
 | 
						|
action
 | 
						|
    : ACTION 
 | 
						|
        { $$ = yytext; }
 | 
						|
    ;
 | 
						|
 | 
						|
regex
 | 
						|
    : start_caret regex_list end_dollar
 | 
						|
        { $$ = $1+$2+$3; }
 | 
						|
    ;
 | 
						|
 | 
						|
start_caret
 | 
						|
    : '^'
 | 
						|
        { $$ = '^'; }
 | 
						|
    |
 | 
						|
        { $$ = ''; }
 | 
						|
    ;
 | 
						|
 | 
						|
end_dollar
 | 
						|
    : '$'
 | 
						|
        { $$ = '$'; }
 | 
						|
    |
 | 
						|
        { $$ = ''; }
 | 
						|
    ;
 | 
						|
 | 
						|
regex_list
 | 
						|
    : regex_list '|' regex_chain
 | 
						|
        { $$ = $1+'|'+$3; }
 | 
						|
    | regex_chain
 | 
						|
    ;
 | 
						|
 | 
						|
regex_chain
 | 
						|
    : regex_chain regex_base
 | 
						|
        { $$ = $1+$2;}
 | 
						|
    | regex_base
 | 
						|
        { $$ = $1;}
 | 
						|
    ;
 | 
						|
 | 
						|
regex_base
 | 
						|
    : '(' regex_list ')'
 | 
						|
        { $$ = '('+$2+')'; }
 | 
						|
    | regex_base '+'
 | 
						|
        { $$ = $1+'+'; }
 | 
						|
    | regex_base '*'
 | 
						|
        { $$ = $1+'*'; }
 | 
						|
    | regex_base '?'
 | 
						|
        { $$ = $1+'?'; }
 | 
						|
    | '/' regex_base
 | 
						|
        { $$ = '(?=' + $regex_base + ')'; }
 | 
						|
    | '/!' regex_base
 | 
						|
        { $$ = '(?!' + $regex_base + ')'; }
 | 
						|
    | name_expansion
 | 
						|
    | regex_base range_regex
 | 
						|
        { $$ = $1+$2; }
 | 
						|
    | any_group_regex
 | 
						|
    | '.'
 | 
						|
        { $$ = '.'; }
 | 
						|
    | string
 | 
						|
    ;
 | 
						|
 | 
						|
name_expansion
 | 
						|
    : '{' name '}'
 | 
						|
        {{ $$ = '{'+$2+'}'; }}
 | 
						|
    ;
 | 
						|
 | 
						|
any_group_regex
 | 
						|
    : ANY_GROUP_REGEX
 | 
						|
        { $$ = yytext; }
 | 
						|
    ;
 | 
						|
 | 
						|
range_regex
 | 
						|
    : RANGE_REGEX
 | 
						|
        { $$ = yytext; }
 | 
						|
    ;
 | 
						|
 | 
						|
string
 | 
						|
    : STRING_LIT
 | 
						|
        { $$ = yy.prepareString(yytext.substr(1, yyleng-2)); }
 | 
						|
    ;
 |