2013-03-28 2 views
-1

Я пытаюсь написать синтаксический анализатор, который принимает выражения как входные данные из файла.Python parser for Calculator

выражения могут быть А = В = 10 или В = (С-А) -4 т.д.

То, что я пытался до сих пор. Я читаю файл IP.txt

import re 

opert = '+-/*()_=' 
fileName = "input.txt" 
f = open(fileName,'r') 

variableDict = {} 
lines = f.readlines() 

for i in lines: 

    for x in re.finditer(r'[A-Z_]\w*', i): 
     print x.group() # prints list containing all the alphabets. 

    for z in re.finditer(r'[0-9]\d*', i): 
     print z.group() # prints list containing all the numbers. 

    for c in i: 
     if c in opert: 
      print C# prints all the operators. 

    # '_' has special meaning. '_' can only be used before numbers only like _1 or _12 etc 
    #And i have parsed this also using 
     print re.findall(r'[_][0-9]\d+',i) # prints the _digits combination. 

Теперь проблема я поражен тем, как я должен приступить к оценке экспрессии. Первое правило, о котором я должен упомянуть о вышеупомянутых входах. Строка не должна превышать 50 символов. Оператор с левой стороны всегда будет оператором присваивания '='. '=' always Предшествующий переменными [A-Z], операторы: {'+', '-', '/', '*', '_'}, цифры {0-9}.

Как я должен сначала извлечь первую переменную затем вставьте его в список питона, то оператор «=», то либо «(», толкать его в стек и так далее «AZ»

Может кто-нибудь помочь мне с этим проблема. Я завален проблема ..

Если какой-либо один не в состоянии понять описание пожалуйста goto this link

+0

Вам нужно исправить там отпечаток. Смешивание вкладок и пробелов не работает для переполнения стека. –

+0

Извините за форматирование, я новичок в stackoverflow, чтобы узнать, как правильно его использовать. –

+0

Возможная отправная точка для вас: [Оценка математического выражения в строке] (http://stackoverflow.com/a/2371789/222914) –

ответ

1

Итак, вы спрашивали о проблеме стека, которые, конечно, нужно для оценки. Я хотел бы сделать что-то

import re #1 
stack = [] #2 FIX: NOT NECESSARY (since fourth line returns a list anyway) 
inputstr = "A=B=C+26-(23*_2)-D" #3 

stack = re.findall(r'(?:[A-Z])|(?:[0-9]+)|(?:[/*+_=\(\)-])', inputstr) #4 

while len(stack): #5 
    print stack.pop() #6 

Первые три строки - это только некоторые элементы инициализации. После этого я сделаю стек с регулярным выражением в четвертой строке. (?:[A-Z]) соответствует переменной, (?:[0-9]+) соответствует номеру (может иметь более одной цифры) и (?:[/*+_=\(\)-]) соответствует всем операторам. Скобки сбегают, а - находится на конце, поэтому вам не нужно его избегать.

Пятая и шестая строки печатают стек.

Я использовал (?: ...), потому что я не хочу соответствовать любой группе. Трудно объяснить - попробуйте запустить его без ?:, и вы увидите эффект.

+0

Спасибо, человек, я пробовал ваш метод. Надеюсь, он решит мою проблему. .Чтобы снова .. –

+0

Вам не нужно заранее назначать 'stack' ... Кроме того, просто объяснять, какое регулярное выражение было бы достаточно. – pradyunsg

+0

Вы правы о второй строке - я исправлю это сейчас. Конечно, я объясняю regex, что достаточно - потому что с этим регулярным выражением он может сделать стек для оценки только в одной строке кода. И весь смысл этой строки на самом деле является регулярным выражением (остальная часть кода не имеет решающего значения для функциональности). – ceruleus