#Global variables
ID_TOKEN = 1
LPAREN_TOKEN = 2
RPAREN_TOKEN = 3
PLUS_OP_TOKEN = 4
MULTI_OP_TOKEN = 5
ILLEGAL_TOKEN = -1
PARCOUNT = 0
token = -1
i = 0
def scanner(user,length):
global ID_TOKEN
global LPAREN_TOKEN
global RPAREN_TOKEN
global PLUS_OP_TOKEN
global MULTI_OP_TOKEN
global ILLEGAL_TOKEN
if(i == length):
return token
elif (user[i] >= 'a' and user[i] <= 'z'):
return ID_TOKEN
elif (user[i] == '('):
return LPAREN_TOKEN
elif (user[i] == ')'):
return RPAREN_TOKEN
elif (user[i] == '+'):
return PLUS_OP_TOKEN
elif (user[i] == '*'):
return MULTI_OP_TOKEN
elif(user[i] == '/0'):
return END_TOKEN
else:
return ILLEGAL_TOKEN
def getNextChar():
global i
i = i+1
def expression(user,length):
global ID_TOKEN
global LPAREN_TOKEN
global RPAREN_TOKEN
global PLUS_OP_TOKEN
global MULTI_OP_TOKEN
global ILLEGAL_TOKEN
global i
global token
global PARCOUNT
if(token == ID_TOKEN):
getNextChar()
token = scanner(user,length)
if(i == length):
return True
elif (token == MULTI_OP_TOKEN or token == PLUS_OP_TOKEN):
getNextChar()
token = scanner(user,length)
return expression(user,length)
elif(token == RPAREN_TOKEN):
if(PARCOUNT > 0):
getNextChar()
token = scanner(user,length)
PARCOUNT = PARCOUNT -1
if(PARCOUNT >0):
return expression(user, length)
elif(PARCOUNT == 0 and i == length):
return True
else:
return False
elif(token == RPAREN_TOKEN and PARCOUNT >0):
PARCOUNT = PARCOUNT -1
if(PARCOUNT >0):
getNextChar()
token = scanner(user,length)
return expression(user, length)
elif(PARCOUNT == 0):
return True
else:
return False
elif(token == LPAREN_TOKEN):
getNextChar()
token = scanner(user,length)
PARCOUNT = PARCOUNT + 1
return expression(user,length)
else:
return False
def main():
global ILLEGAL_TOKEN
global token
global i
print("Hello! Welcome to Parser Function.")
user = input("Please enter a string for parser to check: ")
print("\n")
length = len(user)
if(length > 0):
token= scanner(user,length)
if(token == ILLEGAL_TOKEN ):
print(user, " is not an expression.")
else:
if(expression(user,length)):
print(user, " is an expression.")
else:
print(user, "is not an expression.")
elif (i == length):
print( "This is not an expression.")
main()
CiNHbG9iYWwgdmFyaWFibGVzCklEX1RPS0VOID0gMQpMUEFSRU5fVE9LRU4gPSAyClJQQVJFTl9UT0tFTiA9IDMKUExVU19PUF9UT0tFTiA9IDQKTVVMVElfT1BfVE9LRU4gPSA1CklMTEVHQUxfVE9LRU4gPSAtMQpQQVJDT1VOVCA9IDAKdG9rZW4gPSAtMQppID0gMApkZWYgc2Nhbm5lcih1c2VyLGxlbmd0aCk6CglnbG9iYWwgSURfVE9LRU4gCglnbG9iYWwgTFBBUkVOX1RPS0VOIAoJZ2xvYmFsIFJQQVJFTl9UT0tFTiAKCWdsb2JhbCBQTFVTX09QX1RPS0VOIAoJZ2xvYmFsIE1VTFRJX09QX1RPS0VOIAoJZ2xvYmFsIElMTEVHQUxfVE9LRU4KCWlmKGkgPT0gbGVuZ3RoKToKCQlyZXR1cm4gdG9rZW4KCWVsaWYgKHVzZXJbaV0gPj0gJ2EnIGFuZCB1c2VyW2ldIDw9ICd6Jyk6CgkJcmV0dXJuICBJRF9UT0tFTgoJZWxpZiAodXNlcltpXSA9PSAnKCcpOgoJCXJldHVybiBMUEFSRU5fVE9LRU4KCWVsaWYgKHVzZXJbaV0gPT0gJyknKToKCQlyZXR1cm4gUlBBUkVOX1RPS0VOCgllbGlmICh1c2VyW2ldID09ICcrJyk6CgkJcmV0dXJuIFBMVVNfT1BfVE9LRU4KCWVsaWYgKHVzZXJbaV0gPT0gJyonKToKCQlyZXR1cm4gTVVMVElfT1BfVE9LRU4KCWVsaWYodXNlcltpXSA9PSAnLzAnKToKCQlyZXR1cm4gRU5EX1RPS0VOCgllbHNlOgoJCXJldHVybiBJTExFR0FMX1RPS0VOCgpkZWYgZ2V0TmV4dENoYXIoKToKCWdsb2JhbCBpCglpID0gaSsxCgpkZWYgZXhwcmVzc2lvbih1c2VyLGxlbmd0aCk6CglnbG9iYWwgSURfVE9LRU4gCglnbG9iYWwgTFBBUkVOX1RPS0VOCglnbG9iYWwgUlBBUkVOX1RPS0VOCglnbG9iYWwgUExVU19PUF9UT0tFTiAKCWdsb2JhbCBNVUxUSV9PUF9UT0tFTiAKCWdsb2JhbCBJTExFR0FMX1RPS0VOIAoJZ2xvYmFsIGkKCWdsb2JhbCB0b2tlbgoJZ2xvYmFsIFBBUkNPVU5UCglpZih0b2tlbiA9PSBJRF9UT0tFTik6CgkJZ2V0TmV4dENoYXIoKQoJCXRva2VuID0gc2Nhbm5lcih1c2VyLGxlbmd0aCkKCQlpZihpID09IGxlbmd0aCk6CgkJCXJldHVybiBUcnVlCgkJZWxpZiAodG9rZW4gPT0gTVVMVElfT1BfVE9LRU4gb3IgdG9rZW4gPT0gUExVU19PUF9UT0tFTik6CgkJCWdldE5leHRDaGFyKCkKCQkJdG9rZW4gPSBzY2FubmVyKHVzZXIsbGVuZ3RoKQoJCQlyZXR1cm4gZXhwcmVzc2lvbih1c2VyLGxlbmd0aCkKCQllbGlmKHRva2VuICA9PSBSUEFSRU5fVE9LRU4pOgoJCQlpZihQQVJDT1VOVCA+IDApOgoJCQkJZ2V0TmV4dENoYXIoKQoJCQkJdG9rZW4gPSBzY2FubmVyKHVzZXIsbGVuZ3RoKQoJCQkJUEFSQ09VTlQgPSBQQVJDT1VOVCAtMQoJCQkJaWYoUEFSQ09VTlQgPjApOgoJCQkJCXJldHVybiBleHByZXNzaW9uKHVzZXIsIGxlbmd0aCkKCQkJCWVsaWYoUEFSQ09VTlQgPT0gMCBhbmQgaSA9PSBsZW5ndGgpOgoJCQkJCXJldHVybiBUcnVlCgkJCWVsc2U6CgkJCQlyZXR1cm4gRmFsc2UKCWVsaWYodG9rZW4gID09IFJQQVJFTl9UT0tFTiBhbmQgUEFSQ09VTlQgPjApOgoJCVBBUkNPVU5UID0gUEFSQ09VTlQgLTEKCQlpZihQQVJDT1VOVCA+MCk6CgkJCWdldE5leHRDaGFyKCkKCQkJdG9rZW4gPSBzY2FubmVyKHVzZXIsbGVuZ3RoKQoJCQlyZXR1cm4gZXhwcmVzc2lvbih1c2VyLCBsZW5ndGgpCgkJZWxpZihQQVJDT1VOVCA9PSAwKToKCQkJcmV0dXJuIFRydWUKCQllbHNlOgoJCQlyZXR1cm4gRmFsc2UKCWVsaWYodG9rZW4gPT0gTFBBUkVOX1RPS0VOKToKCQlnZXROZXh0Q2hhcigpCgkJdG9rZW4gPSBzY2FubmVyKHVzZXIsbGVuZ3RoKQoJCVBBUkNPVU5UID0gUEFSQ09VTlQgKyAxCgkJcmV0dXJuIGV4cHJlc3Npb24odXNlcixsZW5ndGgpCgllbHNlOgoJCXJldHVybiBGYWxzZQoKZGVmIG1haW4oKToKCWdsb2JhbCBJTExFR0FMX1RPS0VOIAoJCglnbG9iYWwgdG9rZW4KCWdsb2JhbCBpCglwcmludCgiSGVsbG8hIFdlbGNvbWUgdG8gUGFyc2VyIEZ1bmN0aW9uLiIpCgl1c2VyID0gaW5wdXQoIlBsZWFzZSBlbnRlciBhIHN0cmluZyBmb3IgcGFyc2VyIHRvIGNoZWNrOiAiKQoJcHJpbnQoIlxuIikJCglsZW5ndGggPSBsZW4odXNlcikKCWlmKGxlbmd0aCA+IDApOgoJCXRva2VuPSBzY2FubmVyKHVzZXIsbGVuZ3RoKQoJCWlmKHRva2VuID09IElMTEVHQUxfVE9LRU4gKToKCQkJcHJpbnQodXNlciwgIiBpcyBub3QgYW4gZXhwcmVzc2lvbi4iKQoJCWVsc2U6CgkJCWlmKGV4cHJlc3Npb24odXNlcixsZW5ndGgpKToKCQkJCXByaW50KHVzZXIsICIgaXMgYW4gZXhwcmVzc2lvbi4iKQoJCQllbHNlOgoJCQkJcHJpbnQodXNlciwgImlzIG5vdCBhbiBleHByZXNzaW9uLiIpCgllbGlmIChpID09IGxlbmd0aCk6CgkJCXByaW50KCAiVGhpcyBpcyBub3QgYW4gZXhwcmVzc2lvbi4iKQoJCm1haW4oKQ==