text: #!/usr/bin/env python
  # Takes an input text file containing the SystemVerilog language grammar
  # and converts it to nice linked markdown.
  
  import re
  import os
  
  ourdir = os.path.dirname(os.path.realpath(__file__))
  
  inf = open(os.path.join(ourdir, 'grammar.txt'))
  outf = open(os.path.join(ourdir, '../docs/grammar.md'), 'w')
  
  outf.write('# SystemVerilog\n')
  
  def entry(line):
  	match = re.match(r'(\w+) ::=', line)
  	if match:
  		s = match.group(1)
  		outf.write('<a name="{}"></a>{} ::='.format(s, s.replace('_', '\\_')))
  		line = line[len(match.group(0)):]
  	else:
  		outf.write('&nbsp;&nbsp;&nbsp;&nbsp;')
  
  	saved_match = None
  	match = re.search(r'(\w+) ::=', line)
  	if match:
  		saved_match = line[match.start():]
  		line = line[:match.start()]
  
  	def replacer(m):
  		s = m.group(1)
  		t = s
  		for c in ['*', '-', '|', '[', '{', '_']:
  			t = t.replace(c, '\\' + c)
  		if s not in ['|', '[', ']', '{', '}']:
  			return '`{}`'.format(s)
  		return t
  
  	line = line.replace('{,', '{ ,')
  	line = re.sub(r'([^\w\s]+)', replacer, line)
  	line = re.sub(r'(\w+)', r'[\1](#\1)', line)
  	outf.write(line + '  \n')
  
  	if saved_match:
  		entry(saved_match)
  
  for line in inf:
  	line = line.strip()
  	if not line:
  		continue
  
  	if line.startswith('A.'):
  		count = line.split(' ')[0].count('.')
  		if count == 1:
  			outf.write('## ')
  		elif count == 2:
  			outf.write('### ')
  		elif count == 3:
  			outf.write('#### ')
  		else:
  			raise Exception("wut")
  		outf.write(line + '\n')
  	else:
  		entry(line)
  