Найти - Пользователи
Полная версия: конечные атоматы в питоне
Начало » Центр помощи » конечные атоматы в питоне
1
OxyD
Здравствуйте. Нужна помощь, в институте уволили преподшу, преподающую нам программирование, вместо нее поставили другого который не знает питона, он сказал сдаете все лабы будет вам зачет. никакие лекции и семинары у нас не проводятся. 2 лабы я уже вроде как сделал, но как делать вот эту не представляю как:

Цель — научиться использовать принцип конечных автоматов для простейшего лексического анализа.

Задание. Составить программу на языке Python, выполняющую анализ и обработку вводимого текста в соответствии с вариантом задания. В программе не должно быть ограничений на количество и длину строк исходного текста. Предполагается, что текст дан в кодировке ASCII и содержит буквы только латинского алфавита.

Замечания. Программа должна читать данные со стандартного ввода и выводить на стандартный вывод. Знак табуляции обозначается как «\t», а перевод строки «\n» при работе над программой.

Выделить все нечетные числа в тексте, если сумма их цифр четна.
< if i was you, i'd do 77 labs in 3 weeks
> 77
Пример Реализовать конечный автомат для подсчета слов в тексте, состоящего только из букв латинского алфавита и разделителей:**
from sys import stdin
k = 0
state = “out”
for char in stdin.read():
if state == “out”:
if “a” <= char <= “z” or “A” <= c <= “Z”:
state = “in”
k = k + 1
elif state == “in”:
if char == “ ” or char == “\t” or char == “\n” or char == “,”:
state = “out”
print k

с машиной тьюринга знаком, но не могу понять как заставить питон перебирать символы строк, что за метод(?) stdin.read, sys, char, from import stdin. Объясните хотя пример который приведен выше, за что каждое слово в ном отвечает, сам я нигде про это не могу найти информации(
спасибо
OxyD
ой извините за дубблирование у меня браузер завис, удалите 2 темы
sp3
while True:
    stroka = raw_input('<')
    if stroka == 'q':
        break
    for slovo in stroka.split():
        if slovo.isdigit():
            if not int(slovo)%2:
                if  sum(map(int,slovo)) %2:
                    print '>',slovo
OxyD
спасибо! только поясните как дать программе понять что я закончил вводить текст, и начался его анализ?
py.user.next
OxyD
Выделить все нечетные числа в тексте, если сумма их цифр четна.
< if i was you, i'd do 77 labs in 3 weeks
> 77
#!/usr/bin/env python3
 
def func(s):
    """Search even sums of digit words."""
    delims = ' '
    digits = '0123456789'
     
    lst = []
     
    state = 0
    word, wsum = '', 0
     
    i, slen = 0, len(s)
    while i < slen:
        c = s[i]
        if state == 0:
            if c not in delims:
                i -= 1
                state = 1
        elif state == 1:
            if c in digits:
                word += c
                wsum += int(c)
            elif c not in delims:
                word, wsum = '', 0
                state = 0
            if c in delims or i + 1 == slen:
                i -= 1
                state = 2
        elif state == 2:
            if wsum % 2 == 0:
                lst.append(word)
            word, wsum = '', 0
            state = 0
        i += 1
    return lst
 
if __name__ == '__main__':    
    strings = ("4 abc 12 def 345 ghi 5 jkl 57",
               " 4 abc 12 def 345 ghi 5 jkl 57 ",
               "1 2 3 4 5 6 7 8 9 10 11")
    for s in strings:           
        print('str: <{0}>\n'
              'lst: {1}'.format(s, func(s)))
[guest@localhost py]$ ./evensums.py
str: <4 abc 12 def 345 ghi 5 jkl 57>
lst: ['4', '345', '57']
str: < 4 abc 12 def 345 ghi 5 jkl 57 >
lst: ['4', '345', '57']
str: <1 2 3 4 5 6 7 8 9 10 11>
lst: ['2', '4', '6', '8', '11']
[guest@localhost py]$

новая версия
#!/usr/bin/env python3
 
def func(s):
    """Search even sums of digit words."""
    delims = ' \t'
    digits = '0123456789'
     
    lst = []
     
    state = 'space'
    word, wsum = '', 0
     
    i, slen = 0, len(s)
    while i < slen:
        c = s[i]
        if state == 'space':
            if c not in delims:
                i -= 1
                state = 'word'
        elif state == 'word':
            if c in digits:
                i -= 1
                state = 'digits'
            else:
                state = 'skip'
        elif state == 'digits':
            if c in digits:
                word += c
                wsum += int(c)
            if c in delims or \
               (c in digits and i + 1 == slen):
                i -= 1
                state = 'count'
            elif c not in digits:
                word, wsum = '', 0
                state = 'skip'
        elif state == 'skip':
            if c in delims:
                state = 'space'
        elif state == 'count':
            if wsum % 2 == 0:
                lst.append(word)
            word, wsum = '', 0
            state = 'space'
        i += 1
    return lst
 
if __name__ == '__main__':    
    strings = (" 4 abc 12 def 345 ghi 5 jkl 57 ",
               "4 abc 12 def 345a345 ghi 5 jkl 57",
               "4 abc 12 def 345 ghi 5 jkl 57a",
               "1 2 3 4 5 6 7 8 9 10")
    for s in strings:           
        print('str: <{0}>\n'
              'lst: {1}'.format(s, func(s)))
[guest@localhost py]$ ./evsums.py
str: < 4 abc 12 def 345 ghi 5 jkl 57 >
lst: ['4', '345', '57']
str: <4 abc 12 def 345a345 ghi 5 jkl 57>
lst: ['4', '57']
str: <4 abc 12 def 345 ghi 5 jkl 57a>
lst: ['4', '345']
str: <1 2 3 4 5 6 7 8 9 10>
lst: ['2', '4', '6', '8']
[guest@localhost py]$
OxyD
Вроде стал чуток разбираться, можете подробней написать про stdin, я так понимаю это ввод данных с клавиатуры, как обозначить конец ввода?
py.user.next
исправил две логические ошибки у себя
старую версию оставил для сравнения
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB