Code: Select all
XIncludeFile "modul_scanner.pbi"
EnableExplicit
UseModule meta_scanner
Procedure WriteScanner()
WriteStringN(scanner\fileoutputchannel, "Enumeration toktype")
WriteStringN(scanner\fileoutputchannel, " #none")
WriteStringN(scanner\fileoutputchannel, " #string")
WriteStringN(scanner\fileoutputchannel, " #integer ")
WriteStringN(scanner\fileoutputchannel, " #float ")
WriteStringN(scanner\fileoutputchannel, " #id")
WriteStringN(scanner\fileoutputchannel, " #anychar ")
WriteStringN(scanner\fileoutputchannel, " #code")
WriteStringN(scanner\fileoutputchannel, " #collect ")
WriteStringN(scanner\fileoutputchannel, "EndEnumeration ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Structure token")
WriteStringN(scanner\fileoutputchannel, " token.s")
WriteStringN(scanner\fileoutputchannel, " tokentype.i")
WriteStringN(scanner\fileoutputchannel, "EndStructure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Structure scan ")
WriteStringN(scanner\fileoutputchannel, " token.token ")
WriteStringN(scanner\fileoutputchannel, " line_s.s")
WriteStringN(scanner\fileoutputchannel, " columncount.i ")
WriteStringN(scanner\fileoutputchannel, "EndStructure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Global scanner.scan")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Procedure CopyScannerStructure(*out.scan, *in.scan)")
WriteStringN(scanner\fileoutputchannel, " *out\columncount = *in\columncount")
WriteStringN(scanner\fileoutputchannel, " *out\token\token = *in\token\token")
WriteStringN(scanner\fileoutputchannel, " *out\token\tokentype= *in\token\tokentype")
WriteStringN(scanner\fileoutputchannel, " *out\line_s = *in\line_s")
WriteStringN(scanner\fileoutputchannel, "EndProcedure")
WriteStringN(scanner\fileoutputchannel, "")
WriteStringN(scanner\fileoutputchannel, "Procedure.i IsDigit(char.s)")
WriteStringN(scanner\fileoutputchannel, " Select Asc(char) ")
WriteStringN(scanner\fileoutputchannel, " Case 48 To 57, 46")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn #True")
WriteStringN(scanner\fileoutputchannel, " Default")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn #False ")
WriteStringN(scanner\fileoutputchannel, " EndSelect")
WriteStringN(scanner\fileoutputchannel, "EndProcedure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Procedure.i GETANID()")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Trim(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " If scanner\line_s = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -100 ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " Select Asc(Mid(scanner\line_s, 1, 1))")
WriteStringN(scanner\fileoutputchannel, " Case 65 To 90, 97 To 122, 95 ")
WriteStringN(scanner\fileoutputchannel, " Default")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -50")
WriteStringN(scanner\fileoutputchannel, " EndSelect")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " Protected counter.i = 1")
WriteStringN(scanner\fileoutputchannel, " While Mid(scanner\line_s, counter, 1) <> #CRLF$")
WriteStringN(scanner\fileoutputchannel, " Select Asc(Mid(scanner\line_s, counter, 1))")
WriteStringN(scanner\fileoutputchannel, " Case 65 To 90, 97 To 122, 48 To 57, 95 ")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = scanner\token\token + Mid(scanner\line_s, counter, 1)")
WriteStringN(scanner\fileoutputchannel, " counter + 1")
WriteStringN(scanner\fileoutputchannel, " Default")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Mid(scanner\line_s, counter, Len(scanner\line_s)) ")
WriteStringN(scanner\fileoutputchannel, " scanner\columncount = Len(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #id")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn counter - 1")
WriteStringN(scanner\fileoutputchannel, " Break")
WriteStringN(scanner\fileoutputchannel, " EndSelect")
WriteStringN(scanner\fileoutputchannel, " Wend ")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #none")
WriteStringN(scanner\fileoutputchannel, "EndProcedure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Procedure.i GETINT() ")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Trim(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " If scanner\line_s = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -100 ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " Select Asc(Mid(scanner\line_s, 1, 1))")
WriteStringN(scanner\fileoutputchannel, " Case 48 To 57")
WriteStringN(scanner\fileoutputchannel, " Default")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -51")
WriteStringN(scanner\fileoutputchannel, " EndSelect")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " Protected counter.l = 1")
WriteStringN(scanner\fileoutputchannel, " While Mid(scanner\line_s, counter, 1) <> #CRLF$")
WriteStringN(scanner\fileoutputchannel, " Select Asc(Mid(scanner\line_s, counter, 1))")
WriteStringN(scanner\fileoutputchannel, " Case 48 To 57")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = scanner\token\token + Mid(scanner\line_s, counter, 1)")
WriteStringN(scanner\fileoutputchannel, " counter + 1")
WriteStringN(scanner\fileoutputchannel, " Default")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Mid(scanner\line_s, counter, Len(scanner\line_s)) ")
WriteStringN(scanner\fileoutputchannel, " scanner\columncount = Len(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #integer ")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn counter-1")
WriteStringN(scanner\fileoutputchannel, " EndSelect")
WriteStringN(scanner\fileoutputchannel, " Wend ")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #none")
WriteStringN(scanner\fileoutputchannel, "EndProcedure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Procedure.i GETREAL()")
WriteStringN(scanner\fileoutputchannel, " Protected counter.l = 1")
WriteStringN(scanner\fileoutputchannel, " Protected matchPosition.l")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Trim(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " If scanner\line_s = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -100 ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " Select Asc(Mid(scanner\line_s, 1, 1))")
WriteStringN(scanner\fileoutputchannel, " Case Asc("+Chr(34)+"0"+Chr(34)+") To Asc("+Chr(34)+"9"+Chr(34)+")")
WriteStringN(scanner\fileoutputchannel, " counter = 1")
WriteStringN(scanner\fileoutputchannel, " Case Asc("+Chr(34)+"."+Chr(34)+")")
WriteStringN(scanner\fileoutputchannel, " If IsDigit(Mid(scanner\line_s, 1, 1))")
WriteStringN(scanner\fileoutputchannel, " counter = 2")
WriteStringN(scanner\fileoutputchannel, " Else ")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -52")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " Default")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -52")
WriteStringN(scanner\fileoutputchannel, " EndSelect")
WriteStringN(scanner\fileoutputchannel, " While Mid(scanner\line_s, counter, 1) <> #CRLF$")
WriteStringN(scanner\fileoutputchannel, " Select Asc(Mid(scanner\line_s, counter, 1)) ")
WriteStringN(scanner\fileoutputchannel, " Case Asc("+Chr(34)+"0"+Chr(34)+") To Asc("+Chr(34)+"9"+Chr(34)+")")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = scanner\token\token + Mid(scanner\line_s, counter, 1)")
WriteStringN(scanner\fileoutputchannel, " counter + 1")
WriteStringN(scanner\fileoutputchannel, " Default")
WriteStringN(scanner\fileoutputchannel, " counter - 1")
WriteStringN(scanner\fileoutputchannel, " Break")
WriteStringN(scanner\fileoutputchannel, " EndSelect")
WriteStringN(scanner\fileoutputchannel, " Wend ")
WriteStringN(scanner\fileoutputchannel, " If Mid(scanner\line_s, counter, 1) <> #CRLF$ ")
WriteStringN(scanner\fileoutputchannel, " If Mid(scanner\line_s, counter+1, 1) = "+Chr(34)+"E"+Chr(34)+" Or Mid(scanner\line_s, counter, 1) = "+Chr(34)+"e"+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " If Mid(scanner\line_s, counter+2, 1) = "+Chr(34)+"+"+Chr(34)+" Or Mid(scanner\line_s, counter, 1) = "+Chr(34)+"+"+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " counter + 2")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = scanner\token\token + Mid(scanner\line_s, counter, 1)")
WriteStringN(scanner\fileoutputchannel, " Else ")
WriteStringN(scanner\fileoutputchannel, " counter + 1")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " While Mid(scanner\line_s, counter, 1) <> #CRLF$")
WriteStringN(scanner\fileoutputchannel, " Select Asc(Mid(scanner\line_s, counter, 1)) ")
WriteStringN(scanner\fileoutputchannel, " Case Asc("+Chr(34)+"0"+Chr(34)+") To Asc("+Chr(34)+"9"+Chr(34)+")")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = scanner\token\token + Mid(scanner\line_s, counter, 1)")
WriteStringN(scanner\fileoutputchannel, " counter + 1")
WriteStringN(scanner\fileoutputchannel, " Default")
WriteStringN(scanner\fileoutputchannel, " counter - 1")
WriteStringN(scanner\fileoutputchannel, " Break")
WriteStringN(scanner\fileoutputchannel, " EndSelect")
WriteStringN(scanner\fileoutputchannel, " Wend ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = Mid(scanner\line_s, 1, counter)")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Mid(scanner\line_s, counter+1, Len(scanner\line_s)) ")
WriteStringN(scanner\fileoutputchannel, " If counter > 1 ")
WriteStringN(scanner\fileoutputchannel, " scanner\columncount = Len(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #float ")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn counter")
WriteStringN(scanner\fileoutputchannel, " Else ")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #none")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -53")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, "EndProcedure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Procedure.i GETSTRING()")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Trim(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " If scanner\line_s = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -100 ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " If Mid(scanner\line_s, 1, 1) = Chr(34) ")
WriteStringN(scanner\fileoutputchannel, " Protected counter.l = 2")
WriteStringN(scanner\fileoutputchannel, " While Mid(scanner\line_s, counter, 1) <> #CRLF$")
WriteStringN(scanner\fileoutputchannel, " If Mid(scanner\line_s, counter, 1) = Chr(34) ")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = Mid(scanner\line_s, 1, counter)")
WriteStringN(scanner\fileoutputchannel, " counter + 1")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Mid(scanner\line_s, counter, Len(scanner\line_s)) ")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #string")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn counter")
WriteStringN(scanner\fileoutputchannel, " Else ")
WriteStringN(scanner\fileoutputchannel, " counter + 1")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " Wend ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #none")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -54")
WriteStringN(scanner\fileoutputchannel, "EndProcedure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Procedure.i GETANYCHAR() ")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Trim(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " If scanner\line_s = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -100 ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = Mid(scanner\line_s, 1, 1)")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Mid(scanner\line_s, 2, 1) ")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #anychar ")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn 1")
WriteStringN(scanner\fileoutputchannel, "EndProcedure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Procedure.i TESTTOKEN(stoken.s)")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Trim(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " If scanner\line_s = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -100 ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " Protected counter.i = Len(stoken)")
WriteStringN(scanner\fileoutputchannel, " If Mid(scanner\line_s, 1, counter) = stoken")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = Mid(scanner\line_s, 1, counter)")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Mid(scanner\line_s, counter+1, Len(scanner\line_s)) ")
WriteStringN(scanner\fileoutputchannel, " scanner\columncount = Len(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn counter")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -55")
WriteStringN(scanner\fileoutputchannel, "EndProcedure ")
WriteStringN(scanner\fileoutputchannel, " ")
WriteStringN(scanner\fileoutputchannel, "Procedure.i COLLECTTO(CollectChars.s)")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Trim(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " If scanner\line_s = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -100 ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " Repeat ")
WriteStringN(scanner\fileoutputchannel, " If scanner\line_s = "+Chr(34)+Chr(34)+"")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn -100 ")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " Protected counter.i = FindString(scanner\line_s, CollectChars, #PB_String_CaseSensitive) ")
WriteStringN(scanner\fileoutputchannel, " If counter > 0 ")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = Mid(scanner\line_s, counter + Len(CollectChars), Len(scanner\line_s)) ")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = scanner\token\token + Mid(scanner\line_s, 1, counter)")
WriteStringN(scanner\fileoutputchannel, " Break")
WriteStringN(scanner\fileoutputchannel, " EndIf")
WriteStringN(scanner\fileoutputchannel, " scanner\token\token = scanner\token\token + scanner\line_s ")
WriteStringN(scanner\fileoutputchannel, " scanner\line_s = "+Chr(34)+Chr(34)+" ")
WriteStringN(scanner\fileoutputchannel, " ForEver")
WriteStringN(scanner\fileoutputchannel, " scanner\columncount = Len(scanner\line_s)")
WriteStringN(scanner\fileoutputchannel, " scanner\token\tokentype = #collect ")
WriteStringN(scanner\fileoutputchannel, " ProcedureReturn Len(scanner\token\token) ")
WriteStringN(scanner\fileoutputchannel, "EndProcedure ")
EndProcedure
Procedure.s FindDuplicateRulenames(ruledefinition.s)
Protected.i f=0, location = FindString(ruledefinition, "(")
If location > 0
Protected.s comp, rulename = Mid(ruledefinition, 1, location-1)
ResetMap(meta_scanner::prototypes())
While NextMapElement(meta_scanner::prototypes())
comp = Mid(meta_scanner::prototypes(), 1, location-1)
If comp = rulename
f = 1
Break
EndIf
Wend
If f=1
ProcedureReturn rulename
EndIf
ProcedureReturn ""
EndIf
EndProcedure
Declare.i elem()
Declare.i entry()
Declare.i stmt()
Declare.i prog()
Declare.i elem2()
Declare.i typ1()
Declare.i typ2()
Declare.i expr()
Declare.i elemxp()
Declare.i entry2()
Declare.i too()
Declare.i zero()
Declare.i codes()
Declare.i getcode()
Declare.i recurs()
Declare.i look()
Declare.i errtext()
Declare.i nexts()
Declare.i prim()
Declare.i snm()
Declare.i labels()
Declare.i SEM1()
Declare.i SEM_a1()
Declare.i SEM_b1()
Declare.i SEM2()
Declare.i SEM3()
Declare.i SEM4()
Declare.i SEM5()
Declare.i SEM6()
Declare.i SEM7()
Declare.i SEM8()
Declare.i SEM9()
Declare.i SEM10()
Declare.i SEM10a()
Declare.i SEM10b()
Declare.i SEM10c()
Declare.i SEM11()
Declare.i SEM12()
Declare.i SEM13()
Declare.i SEM14()
Declare.i SEM15()
Declare.i SEM16()
Declare.i SEM17()
Declare.i SEM17a()
Declare.i SEM18()
Declare.i SEM19()
Declare.i SEM20()
Declare.i SEM21()
Declare.i SEM22()
Declare.i SEM22a()
Declare.i SEM23()
Declare.i SEM25()
Declare.i SEM26()
Declare.i SEM27()
Declare.i SEM30()
Declare.i EMPTY()
Declare.i callheader()
Declare.i SEM100()
Declare.i SEM101()
Global.s prototypestring = "", duplicate = ""
Procedure.i prog()
Protected perr.i
PrintN("MetaPi Compiler @RKO 2015")
FLUSH()
FLUSH()
perr = stmt()
If perr < 0
Goto metapi0 ;ProcedureReturn perr
EndIf
metapi1:
perr = stmt()
If perr < 0
Goto metapi2
EndIf
Goto metapi1
metapi2:
perr = TESTTOKEN("#END")
metapi0:
If perr < 0 ;;;;; some error handling
ConsoleColor(4, 0)
WriteStringN(scanner\fileoutputchannel,"Error: in line " + Str(scanner\linecount))
ConsoleColor(2, 0)
WriteStringN(scanner\fileoutputchannel,scanner\org_line)
WriteStringN(scanner\fileoutputchannel,Space((Len(scanner\org_line) - Len(scanner\line_s)))+"^")
ConsoleColor(14, 0)
PrintN("Error: in line " + Str(scanner\linecount))
PrintN(scanner\org_line)
PrintN(Space((Len(scanner\org_line) - Len(scanner\line_s)))+"^")
ConsoleColor(2, 0)
;Goto metapi1
EndIf
ConsoleColor(14, 0)
PrintN("Done compiling " + Str(scanner\linecount) + " lines of BNF")
ConsoleColor(2, 0)
PrintN("Hit Enter to end the program")
ProcedureReturn perr
EndProcedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure.i pointerheader()
Protected perr.i = 0
perr = TESTTOKEN("*")
If perr < 0
Goto new1
EndIf
SEM_a1()
perr = GETANID()
If perr < 0
Goto new1
EndIf
SEM_a1()
perr = TESTTOKEN(".")
If perr < 0
Goto new1
EndIf
SEM_a1()
perr = TESTTOKEN("integer")
If perr < 0
Goto new3
EndIf
new3:
If perr > 0
Goto new2
EndIf
perr = TESTTOKEN("string")
If perr < 0
Goto new4
EndIf
new4:
If perr > 0
Goto new2
EndIf
perr = TESTTOKEN("double")
If perr < 0
Goto new5
EndIf
new5:
If perr > 0
Goto new2
EndIf
perr = TESTTOKEN("Float")
If perr < 0
Goto new6
EndIf
new6:
If perr > 0
Goto new2
EndIf
perr = TESTTOKEN("Quad")
If perr < 0
Goto new7
EndIf
new7:
If perr > 0
Goto new2
EndIf
perr = TESTTOKEN("Unicode")
If perr < 0
Goto new8
EndIf
new8:
If perr > 0
Goto new2
EndIf
perr = TESTTOKEN("Character")
If perr < 0
Goto new9
EndIf
new9:
If perr > 0
Goto new2
EndIf
perr = TESTTOKEN("byte")
If perr < 0
Goto new10
EndIf
new10:
If perr > 0
Goto new2
EndIf
perr = TESTTOKEN("Ascii")
If perr < 0
Goto new11
EndIf
new11:
If perr > 0
Goto new2
EndIf
perr = GETANID()
If perr < 0
Goto new12
EndIf
new12:
new2:
If perr < 0
Goto new1
EndIf
SEM_a1()
new13:
If perr < 0
Goto new14
EndIf
perr = TESTTOKEN(",")
If perr < 0
Goto new16
EndIf
SEM_a1()
perr = TESTTOKEN("*")
If perr < 0
Goto new16
EndIf
SEM_a1()
perr = GETANID()
If perr < 0
Goto new16
EndIf
SEM_a1()
perr = TESTTOKEN(".")
If perr < 0
Goto new16
EndIf
SEM_a1()
perr = TESTTOKEN("integer")
If perr < 0
Goto new18
EndIf
new18:
If perr > 0
Goto new17
EndIf
perr = TESTTOKEN("string")
If perr < 0
Goto new19
EndIf
new19:
If perr > 0
Goto new17
EndIf
perr = TESTTOKEN("double")
If perr < 0
Goto new20
EndIf
new20:
If perr > 0
Goto new17
EndIf
perr = TESTTOKEN("Float")
If perr < 0
Goto new21
EndIf
new21:
If perr > 0
Goto new17
EndIf
perr = TESTTOKEN("Quad")
If perr < 0
Goto new22
EndIf
new22:
If perr > 0
Goto new17
EndIf
perr = TESTTOKEN("Unicode")
If perr < 0
Goto new23
EndIf
new23:
If perr > 0
Goto new17
EndIf
perr = TESTTOKEN("Character")
If perr < 0
Goto new24
EndIf
new24:
If perr > 0
Goto new17
EndIf
perr = TESTTOKEN("byte")
If perr < 0
Goto new25
EndIf
new25:
If perr > 0
Goto new17
EndIf
perr = TESTTOKEN("Ascii")
If perr < 0
Goto new26
EndIf
new26:
If perr > 0
Goto new17
EndIf
perr = GETANID()
If perr < 0
Goto new27
EndIf
new27:
new17:
If perr < 0
Goto new16
EndIf
SEM_a1()
new16:
new15:
If perr < 0
Goto new28
EndIf
new28:
Goto new13
new14:
perr = 1
ProcedureReturn perr
new1:
ProcedureReturn perr
EndProcedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure.i regularheader()
Protected perr.i = 0
perr = GETANID()
If perr < 0
Goto new29
EndIf
SEM_a1()
perr = TESTTOKEN(".")
If perr < 0
Goto new29
EndIf
SEM_a1()
perr = TESTTOKEN("i")
If perr < 0
Goto new31
EndIf
new31:
If perr > 0
Goto new30
EndIf
perr = TESTTOKEN("s")
If perr < 0
Goto new32
EndIf
new32:
If perr > 0
Goto new30
EndIf
perr = TESTTOKEN("d")
If perr < 0
Goto new33
EndIf
new33:
If perr > 0
Goto new30
EndIf
perr = TESTTOKEN("f")
If perr < 0
Goto new34
EndIf
new34:
If perr > 0
Goto new30
EndIf
perr = TESTTOKEN("q")
If perr < 0
Goto new35
EndIf
new35:
If perr > 0
Goto new30
EndIf
perr = TESTTOKEN("u")
If perr < 0
Goto new36
EndIf
new36:
If perr > 0
Goto new30
EndIf
perr = TESTTOKEN("c")
If perr < 0
Goto new37
EndIf
new37:
If perr > 0
Goto new30
EndIf
perr = TESTTOKEN("b")
If perr < 0
Goto new38
EndIf
new38:
If perr > 0
Goto new30
EndIf
perr = TESTTOKEN("a")
If perr < 0
Goto new39
EndIf
new39:
new30:
If perr < 0
Goto new29
EndIf
SEM_a1()
new40:
If perr < 0
Goto new41
EndIf
perr = TESTTOKEN(",")
If perr < 0
Goto new43
EndIf
SEM_a1()
perr = GETANID()
If perr < 0
Goto new43
EndIf
SEM_a1()
perr = TESTTOKEN(".")
If perr < 0
Goto new43
EndIf
SEM_a1()
perr = TESTTOKEN("i")
If perr < 0
Goto new45
EndIf
new45:
If perr > 0
Goto new44
EndIf
perr = TESTTOKEN("s")
If perr < 0
Goto new46
EndIf
new46:
If perr > 0
Goto new44
EndIf
perr = TESTTOKEN("d")
If perr < 0
Goto new47
EndIf
new47:
If perr > 0
Goto new44
EndIf
perr = TESTTOKEN("f")
If perr < 0
Goto new48
EndIf
new48:
If perr > 0
Goto new44
EndIf
perr = TESTTOKEN("q")
If perr < 0
Goto new49
EndIf
new49:
If perr > 0
Goto new44
EndIf
perr = TESTTOKEN("u")
If perr < 0
Goto new50
EndIf
new50:
If perr > 0
Goto new44
EndIf
perr = TESTTOKEN("c")
If perr < 0
Goto new51
EndIf
new51:
If perr > 0
Goto new44
EndIf
perr = TESTTOKEN("b")
If perr < 0
Goto new52
EndIf
new52:
If perr > 0
Goto new44
EndIf
perr = TESTTOKEN("a")
If perr < 0
Goto new53
EndIf
new53:
new44:
If perr < 0
Goto new43
EndIf
SEM_a1()
new43:
new42:
If perr < 0
Goto new54
EndIf
new54:
Goto new40
new41:
perr = 1
ProcedureReturn perr
new29:
ProcedureReturn perr
EndProcedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure.i stmt()
Protected perr.i = 0
perr = GETANID()
If perr < 0
Goto new55
EndIf
SEM_a1()
perr = TESTTOKEN("(")
If perr < 0
Goto new57
EndIf
SEM_a1()
perr = pointerheader()
If perr < 0
Goto new59
EndIf
new59:
If perr > 0
Goto new58
EndIf
perr = regularheader()
If perr < 0
Goto new60
EndIf
new60:
new58:
If perr < 0
Goto new57
EndIf
new61:
If perr < 0
Goto new62
EndIf
perr = pointerheader()
If perr < 0
Goto new64
EndIf
new64:
If perr > 0
Goto new63
EndIf
perr = regularheader()
If perr < 0
Goto new65
EndIf
new65:
new63:
If perr < 0
Goto new66
EndIf
new66:
Goto new61
new62:
perr = 1
perr = TESTTOKEN(")")
If perr < 0
Goto new57
EndIf
SEM_a1()
SEM_b1()
new57:
If perr > 0
Goto new56
EndIf
SEM1()
perr = 1
new67:
new56:
If perr < 0
Goto new55
EndIf
perr = TESTTOKEN(":=")
If perr < 0
Goto new55
EndIf
perr = entry()
If perr < 0
Goto new55
EndIf
new68:
If perr < 0
Goto new69
EndIf
perr = TESTTOKEN("|")
If perr < 0
Goto new71
EndIf
perr = entry()
If perr < 0
Goto new71
EndIf
new71:
new70:
If perr < 0
Goto new72
EndIf
new72:
Goto new68
new69:
perr = 1
SEM4()
SYNCTO(";");
perr = TESTTOKEN(";")
new55:
If duplicate <> ""
ConsoleColor(7, 0)
Print("Warning: duplicate rule definition: ") : PrintN(duplicate)
ConsoleColor(2, 0)
duplicate = ""
EndIf
ProcedureReturn perr
EndProcedure
Procedure.i entry()
Protected perr.i
perr = elem()
If perr < 0
ProcedureReturn perr
EndIf
MetaPi11:
If perr < 0
Goto MetaPi12
EndIf
perr = elem2()
Goto MetaPi11
MetaPi12:
perr = 1
SEM6()
ProcedureReturn perr
EndProcedure
Procedure.i elem()
Protected perr.i
perr = typ1()
If perr < 0
Goto MetaPi14
EndIf
perr = SEM8()
ProcedureReturn perr
MetaPi14:
perr = typ2()
If perr < 0
Goto MetaPi15
EndIf
perr = SEM2()
ProcedureReturn perr
MetaPi15:
perr = prim()
If perr < 0
ProcedureReturn perr
EndIf
SEM8()
ProcedureReturn perr
EndProcedure
Procedure.i elem2()
Protected perr.i
perr = typ1()
If perr < 0
Goto MetaPi17
EndIf
ProcedureReturn perr
MetaPi17:
perr = typ2()
If perr < 0
Goto MetaPi18
EndIf
SEM5()
ProcedureReturn 0
MetaPi18:
perr = prim()
ProcedureReturn perr
EndProcedure
Procedure.i typ1()
Protected perr.i
perr = codes()
If perr < 0
Goto NEW22
EndIf
ProcedureReturn perr
NEW22:
perr = too()
If perr < 0
Goto NEW23
EndIf
ProcedureReturn perr
NEW23:
perr = recurs()
If perr < 0
Goto NEW24
EndIf
ProcedureReturn perr
NEW24:
perr = getcode()
If perr < 0
Goto NEW25
EndIf
ProcedureReturn perr
NEW25:
perr = NEXTs()
If perr < 0
Goto NEW26
EndIf
ProcedureReturn perr
NEW26:
perr = snm()
If perr < 0
Goto NEW27
EndIf
ProcedureReturn perr
NEW27:
perr = labels()
If perr < 0
Goto NEW28
EndIf
ProcedureReturn perr
NEW28:
perr = look()
If perr < 0
Goto NEW29
EndIf
ProcedureReturn perr
NEW29:
perr = zero()
If perr < 0
Goto NEW30
EndIf
ProcedureReturn perr
NEW30:
ProcedureReturn perr
EndProcedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure.i nontermheader()
Protected perr.i = 0
perr = TESTTOKEN("@")
If perr < 0
Goto mh2
EndIf
SEM13()
mh2:
If perr > 0
Goto mh1
EndIf
perr = TESTTOKEN("*")
If perr < 0
Goto mh3
EndIf
SEM13()
mh3:
perr = 1
mh1:
perr = GETANID()
If perr < 0
Goto mh6
EndIf
mh6:
If perr > 0
Goto mh5
EndIf
perr = GETINT()
If perr < 0
Goto mh7
EndIf
mh7:
If perr > 0
Goto mh5
EndIf
perr = GETSTRING()
If perr < 0
Goto mh8
EndIf
mh8:
If perr > 0
Goto mh5
EndIf
perr = GETREAL()
If perr < 0
Goto mh9
EndIf
mh9:
mh5:
If perr < 0
Goto mh4
EndIf
SEM13()
mh10:
If perr < 0
Goto mh11
EndIf
perr = TESTTOKEN(",")
If perr < 0
Goto mh13
EndIf
SEM13()
perr = TESTTOKEN("@")
If perr < 0
Goto mh15
EndIf
SEM13()
mh15:
If perr > 0
Goto mh14
EndIf
perr = TESTTOKEN("*")
If perr < 0
Goto mh16
EndIf
SEM13()
mh16:
perr = 1
mh14:
perr = GETANID()
If perr < 0
Goto mh18
EndIf
mh18:
If perr > 0
Goto mh17
EndIf
perr = GETINT()
If perr < 0
Goto mh19
EndIf
mh19:
If perr > 0
Goto mh17
EndIf
perr = GETSTRING()
If perr < 0
Goto mh20
EndIf
mh20:
If perr > 0
Goto mh17
EndIf
perr = GETREAL()
If perr < 0
Goto mh21
EndIf
mh21:
mh17:
If perr < 0
Goto mh13
EndIf
SEM13()
mh13:
mh12:
If perr < 0
Goto mh22
EndIf
mh22:
Goto mh10
mh11:
perr = 1
ProcedureReturn perr
mh4:
ProcedureReturn perr
EndProcedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure.i typ2()
Protected perr.i = 0
perr = expr()
If perr < 0
Goto typ221
EndIf
ProcedureReturn perr
typ221:
perr = GETANID()
If perr < 0
Goto typ222
EndIf
SEM100()
perr = TESTTOKEN("(")
If perr < 0
Goto typ224
EndIf
SEM13()
perr = nontermheader()
If perr < 0
Goto typ224
EndIf
perr = TESTTOKEN(")")
If perr < 0
Goto typ224
EndIf
SEM12()
typ224:
If perr > 0
Goto typ223
EndIf
SEM101()
perr = 1
typ225:
typ223:
If perr < 0
Goto typ222
EndIf
ProcedureReturn perr
typ222:
perr = GETSTRING()
If perr < 0
Goto typ226
EndIf
SEM11()
ProcedureReturn perr
typ226:
perr = TESTTOKEN(".ID")
If perr < 0
Goto typ227
EndIf
SEM20()
perr = TESTTOKEN(":")
If perr < 0
Goto typ229
EndIf
perr = GETANID()
If perr < 0
Goto typ229
EndIf
SEM30()
typ229:
perr = 1
typ228:
perr = POPSTACK(3)
ProcedureReturn perr
typ227:
perr = TESTTOKEN(".INT")
If perr < 0
Goto typ230
EndIf
SEM21()
perr = TESTTOKEN(":")
If perr < 0
Goto typ232
EndIf
perr = GETANID()
If perr < 0
Goto typ232
EndIf
SEM30()
typ232:
perr = 1
typ231:
perr = POPSTACK(3)
ProcedureReturn perr
typ230:
perr = TESTTOKEN(".REAL")
If perr < 0
Goto typ233
EndIf
SEM22a()
perr = TESTTOKEN(":")
If perr < 0
Goto typ235
EndIf
perr = GETANID()
If perr < 0
Goto typ235
EndIf
SEM30()
typ235:
perr = 1
typ234:
perr = POPSTACK(3)
ProcedureReturn perr
typ233:
perr = TESTTOKEN(".GETSTRING")
If perr < 0
Goto typ236
EndIf
SEM22()
perr = TESTTOKEN(":")
If perr < 0
Goto typ238
EndIf
perr = GETANID()
If perr < 0
Goto typ238
EndIf
SEM30()
typ238:
perr = 1
typ237:
perr = POPSTACK(3)
ProcedureReturn perr
typ236:
perr = TESTTOKEN(".LABEL(")
If perr < 0
Goto typ239
EndIf
SEM25()
ProcedureReturn perr
typ239:
ProcedureReturn perr
EndProcedure
Procedure.i expr()
Protected perr.i
perr = TESTTOKEN("(")
If perr < 0
ProcedureReturn perr
EndIf
SEM23()
perr = elemxp()
If perr < 0
ProcedureReturn perr
EndIf
perr = TESTTOKEN(")")
If perr < 0
ProcedureReturn perr
EndIf
SEM7()
EndProcedure
Procedure.i elemxp()
Protected perr.i
perr = entry2()
If perr < 0
ProcedureReturn perr
EndIf
MetaPi35:
If perr < 0
Goto MetaPi36
EndIf
perr = TESTTOKEN("|")
If perr < 0
Goto MetaPi39
EndIf
SEM3()
perr = entry2()
MetaPi39:
Goto MetaPi35
MetaPi36:
perr = 1
ProcedureReturn perr
EndProcedure
Procedure.i entry2()
Protected perr.i
perr = elem()
If perr < 0
ProcedureReturn perr
EndIf
MetaPi41:
If perr < 0
Goto MetaPi42
EndIf
perr = elem2()
Goto MetaPi41
MetaPi42:
perr = 1
SEM7()
ProcedureReturn perr
EndProcedure
Procedure.i too()
Protected perr.i
perr = TESTTOKEN(".SYNC2")
If perr < 0
ProcedureReturn perr
EndIf
perr = TESTTOKEN("(")
If perr < 0
ProcedureReturn perr
EndIf
perr = GETSTRING()
EMIT(" SYNCTO(")
EMIT("", #FROMOUT)
EMIT(");")
perr = TESTTOKEN(")")
If perr < 0
ProcedureReturn perr
EndIf
FLUSH()
ProcedureReturn perr
EndProcedure
Procedure.i zero()
Protected perr.i
perr = TESTTOKEN("{")
If perr < 0
ProcedureReturn perr
EndIf
SEM23()
perr = elemxp()
If perr < 0
Goto NEWS54
EndIf
NEWS54:
If perr > 0
Goto NEWS53
EndIf
perr = 1
NEWS53:
perr = TESTTOKEN("}")
If perr < 0
Goto NEWS52
EndIf
SEM27()
ProcedureReturn perr
NEWS52:
ProcedureReturn perr
EndProcedure
Procedure.i codes()
Protected perr.i
perr = TESTTOKEN("@@")
If perr < 0
ProcedureReturn perr
EndIf
FLUSH()
EMIT("; START OF USER CODE")
FLUSH()
perr = DOCODES("@@")
If perr < 0
ProcedureReturn perr
EndIf
EMIT("; END OF USER CODE")
FLUSH()
FLUSH()
ProcedureReturn perr
EndProcedure
Procedure.i getcode()
Protected perr.i
perr = TESTTOKEN(".COLLECT2")
If perr < 0
ProcedureReturn perr
EndIf
perr = TESTTOKEN("(")
If perr < 0
ProcedureReturn perr
EndIf
perr = GETSTRING()
EMIT(" COLLECTTO(*inputline, *tok, ")
EMIT("", #FROMOUT)
perr = TESTTOKEN(")")
If perr < 0
ProcedureReturn perr
EndIf
EMIT(");")
FLUSH()
EMIT(" if perr < 0")
FLUSH()
EMIT(" ProcedureReturn perr")
FLUSH()
EMIT(" endif")
FLUSH()
ProcedureReturn perr
EndProcedure
Procedure.i recurs()
Protected perr.i
perr = TESTTOKEN("$")
If perr < 0
ProcedureReturn perr
EndIf
SEM14()
perr = elem()
If perr < 0
ProcedureReturn perr
EndIf
SEM15()
ProcedureReturn perr
EndProcedure
Procedure.i look()
Protected perr.i
perr = TESTTOKEN("?")
If perr < 0
Goto NEWS49
EndIf
SEM26()
perr = elem()
If perr < 0
Goto NEWS49
EndIf
SEM16()
ProcedureReturn perr
NEWS49:
ProcedureReturn perr
EndProcedure
Procedure.i lookzero()
Protected perr.i
perr = TESTTOKEN("?[")
If perr < 0
ProcedureReturn perr
EndIf
SEM26()
SEM23()
perr = elemxp()
If perr < 0
Goto NEWS54
EndIf
NEWS54:
If perr > 0
Goto NEWS53
EndIf
perr = 1
NEWS53:
perr = TESTTOKEN("]")
If perr < 0
Goto NEWS52
EndIf
SEM16()
SEM27()
ProcedureReturn perr
NEWS52:
SEM16()
ProcedureReturn perr
EndProcedure
Procedure.i errtext()
Protected perr.i
perr = TESTTOKEN("<<")
If perr < 0
Goto NEWSs49
EndIf
perr = GETSTRING()
If perr < 0
Goto NEWSs49
EndIf
SEM9()
perr = TESTTOKEN(",")
If perr < 0
Goto NEWSs48
EndIf
perr = GETSTRING()
SEM19()
If perr < 0
Goto NEWSs49
EndIf
NEWSs48:
perr = TESTTOKEN(">>")
ProcedureReturn perr
NEWSs49:
ProcedureReturn perr
EndProcedure
Procedure.i nexts()
Protected perr.i
perr = TESTTOKEN(".FLUSH")
If perr < 0
ProcedureReturn perr
EndIf
SEM18()
ProcedureReturn 1
EndProcedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure.i callheader()
Protected perr.i = 0
perr = TESTTOKEN("@")
If perr < 0
Goto prim12
EndIf
prim12:
If perr > 0
Goto prim11
EndIf
perr = TESTTOKEN("*")
If perr < 0
Goto prim13
EndIf
prim13:
perr = 1
prim11:
SEM13()
perr = GETANID()
If perr < 0
Goto prim16
EndIf
prim16:
If perr > 0
Goto prim15
EndIf
perr = GETINT()
If perr < 0
Goto prim17
EndIf
prim17:
If perr > 0
Goto prim15
EndIf
perr = GETSTRING()
If perr < 0
Goto prim18
EndIf
prim18:
If perr > 0
Goto prim15
EndIf
perr = GETREAL()
prim15:
If perr < 0
Goto prim14
EndIf
SEM13()
prim19:
If perr < 0
Goto prim110
EndIf
perr = TESTTOKEN(",")
If perr < 0
Goto prim112
EndIf
SEM13()
perr = TESTTOKEN("@")
If perr < 0
Goto prim114
EndIf
prim114:
If perr > 0
Goto prim113
EndIf
perr = TESTTOKEN("*")
If perr < 0
Goto prim115
EndIf
prim115:
perr = 1
prim113:
SEM13()
perr = GETANID()
If perr < 0
Goto prim117
EndIf
prim117:
If perr > 0
Goto prim116
EndIf
perr = GETINT()
If perr < 0
Goto prim118
EndIf
prim118:
If perr > 0
Goto prim116
EndIf
perr = GETSTRING()
If perr < 0
Goto prim119
EndIf
prim119:
If perr > 0
Goto prim116
EndIf
perr = GETREAL()
prim116:
If perr < 0
Goto prim112
EndIf
SEM13()
prim112:
prim111:
If perr < 0
Goto prim120
EndIf
prim120:
Goto prim19
prim110:
perr = 1
ProcedureReturn perr
prim14:
ProcedureReturn perr
EndProcedure
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Procedure.i prim()
Protected perr.i = 0
perr = TESTTOKEN(".")
If perr < 0
Goto prim91
EndIf
perr = GETANID()
If perr < 0
Goto prim91
EndIf
SEM17()
perr = TESTTOKEN("(")
If perr < 0
Goto prim93
EndIf
;SEM13()
perr = callheader()
If perr < 0
Goto prim93
EndIf
prim94:
If perr < 0
Goto prim95
EndIf
perr = TESTTOKEN(",")
If perr < 0
Goto prim97
EndIf
SEM13()
perr = callheader()
If perr < 0
Goto prim97
EndIf
prim97:
prim96:
If perr < 0
Goto prim98
EndIf
prim98:
Goto prim94
prim95:
perr = 1
perr = TESTTOKEN(")")
If perr < 0
Goto prim93
EndIf
SEM12()
prim93:
If perr > 0
Goto prim92
EndIf
perr = 1
prim92:
If perr < 0
Goto prim91
EndIf
ProcedureReturn perr
prim91:
ProcedureReturn perr
EndProcedure