diff --git a/h2inc_parser.py b/h2inc_parser.py new file mode 100644 index 0000000..3061c24 --- /dev/null +++ b/h2inc_parser.py @@ -0,0 +1,193 @@ +# (c)2018 Jan Lerking +# Convert a C-header file to an asm include file + +import sys +import string + +#Creates a list of elements per line in file, +#then adding this list as a single element in a global tuple +def parseline(lines): + tupline = []; + word = [w for w in lines.split()] + for w in word: + if w in hdr_keywords: + v=hdr_keywords[w] + tupline.append(v) + tupline.append(w) + return tupline + +def parseparsed(tup): + global multilinecomment + parsedline = ''; + if len(tup)>0: + if tup[0] == ELEMENT_TYPE_COMMENT_START: + if tup[-1] == ELEMENT_TYPE_COMMENT_END: + multilinecomment=False + else: + multilinecomment=True + parsedline=parsecomment(tup) + if tup[0] == ELEMENT_TYPE_COMMENT_MULTILINE and multilinecomment==True: + parsedline=parsecomment(tup) + if tup[0] == ELEMENT_TYPE_IFNDEF: + parsedline=parsedefs(tup) + if tup[0] == ELEMENT_TYPE_DEFINE: + parsedline=parsedefs(tup) + if tup[0] == ELEMENT_TYPE_INCLUDE: + parsedline=parseinclude(tup) + if tup[0] == ELEMENT_TYPE_ELIF: + parsedline=parsedefs(tup) + if tup[0] == ELEMENT_TYPE_IF: + parsedline=parsedefs(tup) + if tup[0] == ELEMENT_TYPE_ELSE: + parsedline=parsedefs(tup) + if tup[0] == ELEMENT_TYPE_ENDIF: + parsedline=parseendif(tup) + if tup[0] == ELEMENT_TYPE_IFDEF: + parsedline=parsedefs(tup) + if tup[0] == ELEMENT_TYPE_ERROR: + parsedline=parsedefs(tup) + if tup[0] == ELEMENT_TYPE_UNDEF: + parsedline=parseundef(tup) + if tup[0] == ELEMENT_TYPE_PRAGMA: + parsedline=parsedefs(tup) + else: + parsedline=parseemptyline() + return parsedline + +def parsecomment(element): + global multilinecomment + index = 0 + elist = element + if elist[-1] == ELEMENT_TYPE_COMMENT_END: + elist[-1] = '\n' + if elist[0] in inc_keywords: + elist[1]=inc_keywords[elist[0]] + del elist[0] + for e in elist: + if e in inc_keywords: + elist[index]=inc_keywords[e] + del elist[index] + index +=1 + if elist[-1] != '\n': + elist.append('\n') + line = ' '.join(elist) + return line + +def parseemptyline(): + line='\n' + return line + +def parsedefs(element): + elist = element + clist = [] + if len(elist)>2: #If more than 2 elements in line, 3rd element is a singleline comment. + clist = parsecomment(elist) + if elist[0] in inc_keywords: + elist[1]=inc_keywords[elist[0]] + del elist[0] + if elist[-1] != '\n': + elist.append('\n') + line = ' '.join(elist) + return line + +def parseinclude(element): + elist = element + if elist[0] in inc_keywords: + elist[1]=inc_keywords[elist[0]] + del elist[0] + if len(elist)>2: #If more than 2 elements in line, 3rd element is a singleline comment. + if elist[2] in inc_keywords: + elist[3]=inc_keywords[elist[2]] + del elist[2] + if elist[-2] in inc_keywords: + elist[-1]=inc_keywords[elist[-2]] + del elist[-2] + tempstr = str(elist[1]) + tempstr = tempstr.replace('<', '"') + tempstr = tempstr.replace('.h>', '.inc"') + tempstr = tempstr.replace('.h"', '.inc"') + elist[1] = tempstr + if elist[-1] != '\n': + elist.append('\n') + line = ' '.join(elist) + return line + +def parseendif(element): + elist = element + if elist[0] in inc_keywords: + elist[1]=inc_keywords[elist[0]] + del elist[0] + if len(elist) > 1: + if elist[1] in inc_keywords: + elist[2]=inc_keywords[elist[1]] + del elist[1] + if elist[-2] in inc_keywords: + elist[-1]=inc_keywords[elist[-2]] + del elist[-2] + if elist[-1] != '\n': + elist.append('\n') + line = ' '.join(elist) + return line + +def parseundef(element): + elist = element + if elist[0] in inc_keywords: + elist[1]=inc_keywords[elist[0]] + del elist[0] + if elist[1] in inc_keywords: + elist[2]=inc_keywords[elist[1]] + del elist[1] + if elist[-2] in inc_keywords: + elist[-1]=inc_keywords[elist[-2]] + del elist[-2] + if elist[-1] != '\n': + elist.append('\n') + line = ' '.join(elist) + return line + +multilinecomment = False + +ELEMENT_TYPE_DEFINE = 1 +ELEMENT_TYPE_INCLUDE = 2 +ELEMENT_TYPE_UNDEF = 3 +ELEMENT_TYPE_IFDEF = 4 +ELEMENT_TYPE_IFNDEF = 5 +ELEMENT_TYPE_IF = 6 +ELEMENT_TYPE_ELSE = 7 +ELEMENT_TYPE_ELIF = 8 +ELEMENT_TYPE_ENDIF = 9 +ELEMENT_TYPE_ERROR = 10 +ELEMENT_TYPE_PRAGMA = 11 +ELEMENT_TYPE_COMMENT_START = 20 +ELEMENT_TYPE_COMMENT_MULTILINE = 21 +ELEMENT_TYPE_COMMENT_END = 22 + +hdr_keywords = {'/*': ELEMENT_TYPE_COMMENT_START, + '*': ELEMENT_TYPE_COMMENT_MULTILINE, + '*/': ELEMENT_TYPE_COMMENT_END, + '#define': ELEMENT_TYPE_DEFINE, + '#include': ELEMENT_TYPE_INCLUDE, + '#undef': ELEMENT_TYPE_UNDEF, + '#ifdef': ELEMENT_TYPE_IFDEF, + '#ifndef': ELEMENT_TYPE_IFNDEF, + '#if': ELEMENT_TYPE_IF, + '#else': ELEMENT_TYPE_ELSE, + '#elif': ELEMENT_TYPE_ELIF, + '#endif': ELEMENT_TYPE_ENDIF, + '#error': ELEMENT_TYPE_ERROR, + '#pragma': ELEMENT_TYPE_PRAGMA} + +inc_keywords = {ELEMENT_TYPE_COMMENT_START: ';', + ELEMENT_TYPE_COMMENT_MULTILINE: ';', + ELEMENT_TYPE_COMMENT_END: '', + ELEMENT_TYPE_DEFINE: '%define', + ELEMENT_TYPE_INCLUDE: '%include', + ELEMENT_TYPE_UNDEF: '%undef', + ELEMENT_TYPE_IFDEF: '%ifdef', + ELEMENT_TYPE_IFNDEF: '%ifndef', + ELEMENT_TYPE_IF: '%if', + ELEMENT_TYPE_ELSE: '%else', + ELEMENT_TYPE_ELIF: '%elif', + ELEMENT_TYPE_ENDIF: '%endif', + ELEMENT_TYPE_ERROR: '%error', + ELEMENT_TYPE_PRAGMA: '%pragma'} \ No newline at end of file