2015-02-05 2 views
-2

Я не могу понять, почему строка 104 продолжает возвращать недействительный синтаксис, может кто-то, пожалуйста, указать мне в правильном направлении? Это связано с тем, как я использовал elif? Извините, если это вопрос новичков!Python словарь, если/else недействительный синтаксис

Строка 104 является заявление еще в течение пункта в workingDict.keys() петли внутри printGrammar

import sys 
    import string 
    from collections import defaultdict 

    #default length of 3 
    stringLength = 3 

    #get last argument of command line(file) 
    if len(sys.argv) == 1: 
     #get a length from user 
     try: 
      stringLength = int(input('Length? ')) 
      filename = input('Filename: ') 
     except ValueError: 
      print("Not a number") 

    elif len(sys.argv) == 2: 
     #get a length from user 
     try: 
      stringLength = int(input('Length? ')) 
      filename = sys.argv[1] 
     except ValueError: 
      print("Not a number") 

    elif len(sys.argv) == 3: 
     filename = sys.argv[2] 
     stringLength = sys.argv[1].split('l')[1] 
    else: 
     print("Invalid input!") 


    #get start symbol 
    with open(filename, "r") as grammar: 
     #read file 
     lines = grammar.readlines() 
     start = lines[0].split('=')[0] 
     start = start.replace(" ", "") 


    #checks 

    #print(stringLength) 
    #print(filename) 
    #print(start) 
    def str2dict(filename): 
     result = defaultdict(list) 
     with open(filename, "r") as grammar: 
      #read file 
      lines = grammar.readlines() 
      count = 0 

      #loop through 
      for line in lines: 
       #append info 
       line = line.rstrip() 

       result[line[0]].append(line.split('=')[1]) 

     return result 


    workingDict = str2dict("Binary.txt") 
    print(workingDict) 



    def printGrammar(result): 
     sentenceList = [] 
     workList = [] 
     workList.append(start) 
     i = 0 
     firstNT = "" 


     #While the worklist is not empty: 
     while(len(workList) != 0): 
      #Get and delete one potential sentence s from the worklist. 
      symbol = workList.pop() 
      #If the | s | > N, continue. 
      if len(str(symbol).replace(" ", "")) > int(stringLength): 
       continue 

      else: 
       if str(symbol) in workingDict.keys(): 
        #append the right derivation 
        for item in workingDict.get(symbol): 
         workList.append(list(item.replace(" ", ""))) 
        #workList.append(str(workingDict.get(symbol))) 
        #add derivation 
        print(workingDict.keys()) 
      #If s has no nonterminals, print s and continue. 
      for item in workingDict.keys(): 
       print("test") 
       print(''.join(item)) 
       if len(item) != 1: 
        continue 

       #if the element is in dictionary, dont print  
       elif ''.join(item) in workingDict.keys(): 
        continue 

       print(symbol) 
       #if element is not in dictionary, print 
       else: 
        print("THIS IS A TERMINAL!!") 
        print(item) 
      #Choose the leftmost nonterminal NT. 
      print(workList) 
      #For all productions NT -> rhs: 
       #Replace NT in s with rhs; call it tmp. 
       #Store tmp on worklist. 






     return workList 
    print (printGrammar(workingDict)) 
+1

Можете ли вы отредактировать вопрос, чтобы указать, какая строка является «строкой 104»? – Eithos

+0

Я предполагаю, что любая строка, вызывающая проблему, имеет закрытую скобку или скобки какого-либо типа на строке _previous_. – mgilson

+0

Я отредактировал спецификации! – FullCombatBeard

ответ

3

Вы должны отступа линии

print(symbol) 

на том же уровне, continue.

+1

Ну ... +1 для скорости , – Eithos

+0

... или удалите эту строку или поместите ее после 'else', независимо от намерения. Он не будет выполняться после 'continue'. –

Смежные вопросы