постфиксный лексический анализатор - PullRequest
0 голосов
/ 14 декабря 2018

Моя задача была написать очень простой лексический анализатор для выражений постфикса:

print ("enter each variable followed by a space" );
numbers = input("Enter the numbers: ") #ask for input

numbersArray = [] #array to store the input

for number in numbers:
    numbersArray.append(number)

numbersArray = numbersArray[::2]

print(numbersArray);

for x in numbersArray:

    if x == "_": print ( "     " , " delimeter" )
    elif x == "-": print ( "    ", " subtraction opp." )
    elif x == "/": print ( "    ", " divison opp." )
    elif x == "+": print ( "    ", " addition opp." )
    elif x == "*": print ( "    ", " multplication opp." )
    elif x == "0": print ( "    ", " Constant: 0 " )
    elif x == "1": print ( "    ", " Constant: 1" )
    elif x == "2": print ( "    ", " Constant: 2" )
    elif x == "3": print ( "    ", " Constant: 3" )
    elif x == "4": print ( "    ", " Constant: 4" )
    elif x == "5": print ( "    ", " Constant: 5" )
    elif x == "6": print ( "    ", " Constant: 6" )
    elif x == "7": print ( "    ", " Constant: 7" )
    elif x == "8": print ( "    ", " Constant: 8" )
    elif x == "9": print ( "    ", " Constant: 9" )
    elif x == "10": print ( "    ", " Constant: 10" )
    print(x) 

пример ввода: 3 _ 4 _ 5 _ +

выше, что я началЯ впервые использую Python, и я боролся с этим.мне было интересно, есть ли лучший способ, которым я мог бы определить большие числа и буквы как константы и переменные соответственно?

1 Ответ

0 голосов
/ 14 декабря 2018

Я согласен с комментаторами, что использование лексической библиотеки, такой как ply, - самый простой или лучший способ.Если вы все еще хотите / обязаны сделать это самостоятельно, есть пара вещей, которые нужно изменить.

Если вы видите что-то вроде 132, вам нужно перейти к номеру дляследующая итерация цикла, поэтому for x in numbersArray: не работает.Вы можете просто выполнить while True, отследить индекс цикла вручную и завершить работу, когда закончите.

Самый мощный способ сопоставить ваш ввод с лексемой - это регулярные выражения ,Например, вы можете сопоставить числа с необязательной десятичной частью, используя что-то вроде

import re
...
re.match(r'\d+(\.\d*)?', numbersArray[current_index:])

(Большинство спецификаций чисел более «интересны», чем это, поэтому определенно не копируйте мое регулярное выражение.быть неправым в том, что вам нужно.)

Вы можете использовать regex101.com для экспериментов и построения своего регулярного выражения.

Вы также можете использовать встроенный в Python строковые методы , такие как isnumeric и isalpha.При этом ваша проверка номера может выглядеть как

lexeme = ''
while numbersArray[current_index].isdigit():
    lexeme += numbersArray[current_index]
    current_index += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...