You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
import sys
 | 
						|
from argparse import ArgumentParser, FileType
 | 
						|
from textwrap import indent
 | 
						|
from logging import DEBUG, INFO, WARN, ERROR
 | 
						|
from typing import Optional
 | 
						|
import warnings
 | 
						|
 | 
						|
from lark import Lark, logger
 | 
						|
try:
 | 
						|
    from interegular import logger as interegular_logger
 | 
						|
    has_interegular = True
 | 
						|
except ImportError:
 | 
						|
    has_interegular = False
 | 
						|
 | 
						|
lalr_argparser = ArgumentParser(add_help=False, epilog='Look at the Lark documentation for more info on the options')
 | 
						|
 | 
						|
flags = [
 | 
						|
    ('d', 'debug'),
 | 
						|
    'keep_all_tokens',
 | 
						|
    'regex',
 | 
						|
    'propagate_positions',
 | 
						|
    'maybe_placeholders',
 | 
						|
    'use_bytes'
 | 
						|
]
 | 
						|
 | 
						|
options = ['start', 'lexer']
 | 
						|
 | 
						|
lalr_argparser.add_argument('-v', '--verbose', action='count', default=0, help="Increase Logger output level, up to three times")
 | 
						|
lalr_argparser.add_argument('-s', '--start', action='append', default=[])
 | 
						|
lalr_argparser.add_argument('-l', '--lexer', default='contextual', choices=('basic', 'contextual'))
 | 
						|
lalr_argparser.add_argument('-o', '--out', type=FileType('w', encoding='utf-8'), default=sys.stdout, help='the output file (default=stdout)')
 | 
						|
lalr_argparser.add_argument('grammar_file', type=FileType('r', encoding='utf-8'), help='A valid .lark file')
 | 
						|
 | 
						|
for flag in flags:
 | 
						|
    if isinstance(flag, tuple):
 | 
						|
        options.append(flag[1])
 | 
						|
        lalr_argparser.add_argument('-' + flag[0], '--' + flag[1], action='store_true')
 | 
						|
    elif isinstance(flag, str):
 | 
						|
        options.append(flag)
 | 
						|
        lalr_argparser.add_argument('--' + flag, action='store_true')
 | 
						|
    else:
 | 
						|
        raise NotImplementedError("flags must only contain strings or tuples of strings")
 | 
						|
 | 
						|
 | 
						|
def build_lalr(namespace):
 | 
						|
    logger.setLevel((ERROR, WARN, INFO, DEBUG)[min(namespace.verbose, 3)])
 | 
						|
    if has_interegular:
 | 
						|
        interegular_logger.setLevel(logger.getEffectiveLevel())
 | 
						|
    if len(namespace.start) == 0:
 | 
						|
        namespace.start.append('start')
 | 
						|
    kwargs = {n: getattr(namespace, n) for n in options}
 | 
						|
    return Lark(namespace.grammar_file, parser='lalr', **kwargs), namespace.out
 | 
						|
 | 
						|
 | 
						|
def showwarning_as_comment(message, category, filename, lineno, file=None, line=None):
 | 
						|
    # Based on warnings._showwarnmsg_impl
 | 
						|
    text = warnings.formatwarning(message, category, filename, lineno, line)
 | 
						|
    text = indent(text, '# ')
 | 
						|
    if file is None:
 | 
						|
        file = sys.stderr
 | 
						|
        if file is None:
 | 
						|
            return
 | 
						|
    try:
 | 
						|
        file.write(text)
 | 
						|
    except OSError:
 | 
						|
        pass
 | 
						|
 | 
						|
 | 
						|
def make_warnings_comments():
 | 
						|
    warnings.showwarning = showwarning_as_comment
 |