archive projects
This commit is contained in:
parent
7c95c2afaa
commit
243329893a
BIN
P2/__pycache__/app_opener.cpython-39.pyc
Normal file
BIN
P2/__pycache__/app_opener.cpython-39.pyc
Normal file
Binary file not shown.
BIN
P2/__pycache__/browser_opener.cpython-39.pyc
Normal file
BIN
P2/__pycache__/browser_opener.cpython-39.pyc
Normal file
Binary file not shown.
BIN
P2/__pycache__/my_parser.cpython-39.pyc
Normal file
BIN
P2/__pycache__/my_parser.cpython-39.pyc
Normal file
Binary file not shown.
11
P2/app_opener.py
Normal file
11
P2/app_opener.py
Normal file
@ -0,0 +1,11 @@
|
||||
import os
|
||||
|
||||
class AppOpener:
|
||||
def open_app(self, app_name):
|
||||
os.system(f'open -a "{app_name}"')
|
||||
|
||||
def close_app(self, app_name):
|
||||
os.system(f'killall "{app_name}"')
|
||||
|
||||
def open_document(self, document_name):
|
||||
os.system(f'open "{document_name}"')
|
5
P2/browser_opener.py
Normal file
5
P2/browser_opener.py
Normal file
@ -0,0 +1,5 @@
|
||||
import webbrowser
|
||||
|
||||
class BrowserOpener:
|
||||
def open_website(self, website_name):
|
||||
webbrowser.open_new_tab(f'https://{website_name}')
|
15
P2/main.py
Normal file
15
P2/main.py
Normal file
@ -0,0 +1,15 @@
|
||||
from my_parser import Parser
|
||||
|
||||
def main():
|
||||
parser = Parser()
|
||||
while True:
|
||||
try:
|
||||
text = input('> ')
|
||||
except EOFError:
|
||||
break
|
||||
if not text:
|
||||
continue
|
||||
parser.parse(text.lower())
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
53
P2/my_parser.py
Normal file
53
P2/my_parser.py
Normal file
@ -0,0 +1,53 @@
|
||||
from app_opener import AppOpener
|
||||
from browser_opener import BrowserOpener
|
||||
|
||||
class Parser:
|
||||
def __init__(self):
|
||||
self.app_opener = AppOpener()
|
||||
self.browser_opener = BrowserOpener()
|
||||
|
||||
def parse(self, text):
|
||||
if 'open' in text:
|
||||
if 'program' in text:
|
||||
app_name = self._get_app_name(text)
|
||||
self.app_opener.open_app(app_name)
|
||||
elif 'document' in text:
|
||||
document_name = self._get_document_name(text)
|
||||
self.app_opener.open_document(document_name)
|
||||
elif 'website' in text:
|
||||
website_name = self._get_website_name(text)
|
||||
self.browser_opener.open_website(website_name)
|
||||
elif 'close' in text:
|
||||
if 'program' in text:
|
||||
app_name = self._get_app_name(text)
|
||||
self.app_opener.close_app(app_name)
|
||||
|
||||
def _get_app_name(self, text):
|
||||
app_words = ['open program','close program']
|
||||
return self._get_item_name(text, app_words)
|
||||
|
||||
def _get_document_name(self, text):
|
||||
document_words = ['open document', 'close document']
|
||||
return self._get_item_name(text, document_words)
|
||||
|
||||
def _get_website_name(self, text):
|
||||
website_words = ['open website','close website']
|
||||
return self._get_item_name(text, website_words)
|
||||
|
||||
def _get_item_name(self, text, keywords):
|
||||
index = 0
|
||||
for k in keywords:
|
||||
index = text.find(k)
|
||||
if index != -1:
|
||||
index += len(k)
|
||||
return text[index+1:]
|
||||
# words = text.split()
|
||||
# for i, word in enumerate(words):
|
||||
# if word in keywords:
|
||||
# return ' '.join(words[i + 1:])
|
||||
# return ''
|
||||
|
||||
|
||||
p = Parser()
|
||||
|
||||
print(p._get_item_name('open program firefox',['open program']))
|
171
wyklady/3.py
Normal file
171
wyklady/3.py
Normal file
@ -0,0 +1,171 @@
|
||||
# Import lexer and parser from ply module
|
||||
import ply.lex as lex
|
||||
import ply.yacc as yacc
|
||||
|
||||
# List of token types.
|
||||
tokens = (
|
||||
'NUMBER',
|
||||
'OPERATE',
|
||||
'SIZE',
|
||||
'KIND',
|
||||
'COLOR',
|
||||
'MATERIAL'
|
||||
)
|
||||
|
||||
# Token types may be defined as regular expressions, e.g. r'Buy | Sell'
|
||||
|
||||
|
||||
def t_OPERATE(t):
|
||||
r'Buy | Sell'
|
||||
return t
|
||||
|
||||
|
||||
def t_MATERIAL(t):
|
||||
r'metal | plastic'
|
||||
if t.value == 'metal':
|
||||
t.value = 1
|
||||
elif t.value == 'plastic':
|
||||
t.value = 2
|
||||
return t
|
||||
|
||||
|
||||
def t_COLOR(t):
|
||||
r'(black | white | red | green | blue)'
|
||||
if t.value == 'black':
|
||||
t.value = 1
|
||||
elif t.value == 'white':
|
||||
t.value = 2
|
||||
elif t.value == 'red':
|
||||
t.value = 3
|
||||
elif t.value == 'green':
|
||||
t.value = 4
|
||||
elif t.value == 'blue':
|
||||
t.value = 5
|
||||
return t
|
||||
|
||||
|
||||
def t_SIZE(t):
|
||||
r'tiny | small | big | large'
|
||||
if t.value == 'tiny':
|
||||
t.value = 1
|
||||
elif t.value == 'small':
|
||||
t.value = 2
|
||||
elif t.value == 'big':
|
||||
t.value = 3
|
||||
elif t.value == 'large':
|
||||
t.value = 4
|
||||
return t
|
||||
|
||||
|
||||
def t_KIND(t):
|
||||
r'box(es)? | ring(s)?'
|
||||
if t.value[0] == 'b':
|
||||
t.value = 1
|
||||
else:
|
||||
t.value = 2
|
||||
return t
|
||||
|
||||
|
||||
def t_NUMBER(t):
|
||||
r'\d+'
|
||||
t.value = int(t.value)
|
||||
return t
|
||||
|
||||
# Lexer error handling rule (Handle words out of vocabulary)
|
||||
|
||||
|
||||
def t_error(t):
|
||||
print("Illegal character '%s'" % t.value[0])
|
||||
t.lexer.skip(1)
|
||||
|
||||
# Ignore white spaces
|
||||
t_ignore = ' \t'
|
||||
|
||||
# Main parser rule (command)
|
||||
|
||||
|
||||
def p_command(p):
|
||||
'command : OPERATE NUMBER article'
|
||||
index = p[3]
|
||||
# Buy article
|
||||
if p[1] == 'Buy':
|
||||
tab[index] += p[2]
|
||||
print('OK. I am buying ' + str(p[2]) +
|
||||
' new articles indexed as ' + str(index) + '.')
|
||||
print('No of articles in shop: ' + str(tab[index]))
|
||||
# Sell article
|
||||
elif p[1] == 'Sell':
|
||||
if p[2] > tab[index]:
|
||||
print('I do not have as many articles as you want.')
|
||||
else:
|
||||
tab[index] -= p[2]
|
||||
print('OK. I am selling ' + str(p[2]) +
|
||||
' articles indexed as ' + str(index) + '.')
|
||||
print('No of articles in shop: ' + str(tab[index]))
|
||||
|
||||
# Parser rule (attribute)
|
||||
|
||||
|
||||
def p_attribute_color(p):
|
||||
'attribute : COLOR'
|
||||
p[0] = p[1]
|
||||
|
||||
# Parser rule (attribute)
|
||||
|
||||
|
||||
def p_attribute_material(p):
|
||||
'attribute : MATERIAL'
|
||||
p[0] = 10 * p[1]
|
||||
|
||||
|
||||
# Parser rule (attribute)
|
||||
|
||||
|
||||
def p_attribute_size(p):
|
||||
'attribute : SIZE'
|
||||
p[0] = 100 * p[1]
|
||||
|
||||
# Parser rule (article - stop)
|
||||
|
||||
|
||||
def p_article_kind(p):
|
||||
'article : KIND'
|
||||
p[0] = 1000 * p[1]
|
||||
|
||||
# Parser rule (article - recursion)
|
||||
|
||||
|
||||
def p_article_attribute(p):
|
||||
'article : attribute article'
|
||||
p[0] = p[1] + p[2]
|
||||
|
||||
# Syntax error handling rule
|
||||
|
||||
|
||||
def p_error(p):
|
||||
print("Syntax error in input!")
|
||||
|
||||
#######################################
|
||||
# Main program
|
||||
|
||||
# Initialize table of articles (zero articles at the beginning)
|
||||
tab = []
|
||||
for index in range(3000):
|
||||
tab.append(0)
|
||||
|
||||
# Build the lexer
|
||||
lexer = lex.lex()
|
||||
|
||||
# Tokenize (short version)
|
||||
# for tok in lexer:
|
||||
# print(tok)
|
||||
|
||||
# Build the parser
|
||||
parser = yacc.yacc()
|
||||
|
||||
# Main loop
|
||||
while True:
|
||||
s = input('What can I do for you? \n')
|
||||
if s == 'Bye':
|
||||
break
|
||||
parser.parse(s)
|
136
wyklady/parser.out
Normal file
136
wyklady/parser.out
Normal file
@ -0,0 +1,136 @@
|
||||
Created by PLY version 3.11 (http://www.dabeaz.com/ply)
|
||||
|
||||
Grammar
|
||||
|
||||
Rule 0 S' -> command
|
||||
Rule 1 command -> OPERATE NUMBER article
|
||||
Rule 2 attribute -> COLOR
|
||||
Rule 3 attribute -> MATERIAL
|
||||
Rule 4 attribute -> SIZE
|
||||
Rule 5 article -> KIND
|
||||
Rule 6 article -> attribute article
|
||||
|
||||
Terminals, with rules where they appear
|
||||
|
||||
COLOR : 2
|
||||
KIND : 5
|
||||
MATERIAL : 3
|
||||
NUMBER : 1
|
||||
OPERATE : 1
|
||||
SIZE : 4
|
||||
error :
|
||||
|
||||
Nonterminals, with rules where they appear
|
||||
|
||||
article : 1 6
|
||||
attribute : 6
|
||||
command : 0
|
||||
|
||||
Parsing method: LALR
|
||||
|
||||
state 0
|
||||
|
||||
(0) S' -> . command
|
||||
(1) command -> . OPERATE NUMBER article
|
||||
|
||||
OPERATE shift and go to state 2
|
||||
|
||||
command shift and go to state 1
|
||||
|
||||
state 1
|
||||
|
||||
(0) S' -> command .
|
||||
|
||||
|
||||
|
||||
state 2
|
||||
|
||||
(1) command -> OPERATE . NUMBER article
|
||||
|
||||
NUMBER shift and go to state 3
|
||||
|
||||
|
||||
state 3
|
||||
|
||||
(1) command -> OPERATE NUMBER . article
|
||||
(5) article -> . KIND
|
||||
(6) article -> . attribute article
|
||||
(2) attribute -> . COLOR
|
||||
(3) attribute -> . MATERIAL
|
||||
(4) attribute -> . SIZE
|
||||
|
||||
KIND shift and go to state 5
|
||||
COLOR shift and go to state 7
|
||||
MATERIAL shift and go to state 8
|
||||
SIZE shift and go to state 9
|
||||
|
||||
article shift and go to state 4
|
||||
attribute shift and go to state 6
|
||||
|
||||
state 4
|
||||
|
||||
(1) command -> OPERATE NUMBER article .
|
||||
|
||||
$end reduce using rule 1 (command -> OPERATE NUMBER article .)
|
||||
|
||||
|
||||
state 5
|
||||
|
||||
(5) article -> KIND .
|
||||
|
||||
$end reduce using rule 5 (article -> KIND .)
|
||||
|
||||
|
||||
state 6
|
||||
|
||||
(6) article -> attribute . article
|
||||
(5) article -> . KIND
|
||||
(6) article -> . attribute article
|
||||
(2) attribute -> . COLOR
|
||||
(3) attribute -> . MATERIAL
|
||||
(4) attribute -> . SIZE
|
||||
|
||||
KIND shift and go to state 5
|
||||
COLOR shift and go to state 7
|
||||
MATERIAL shift and go to state 8
|
||||
SIZE shift and go to state 9
|
||||
|
||||
attribute shift and go to state 6
|
||||
article shift and go to state 10
|
||||
|
||||
state 7
|
||||
|
||||
(2) attribute -> COLOR .
|
||||
|
||||
KIND reduce using rule 2 (attribute -> COLOR .)
|
||||
COLOR reduce using rule 2 (attribute -> COLOR .)
|
||||
MATERIAL reduce using rule 2 (attribute -> COLOR .)
|
||||
SIZE reduce using rule 2 (attribute -> COLOR .)
|
||||
|
||||
|
||||
state 8
|
||||
|
||||
(3) attribute -> MATERIAL .
|
||||
|
||||
KIND reduce using rule 3 (attribute -> MATERIAL .)
|
||||
COLOR reduce using rule 3 (attribute -> MATERIAL .)
|
||||
MATERIAL reduce using rule 3 (attribute -> MATERIAL .)
|
||||
SIZE reduce using rule 3 (attribute -> MATERIAL .)
|
||||
|
||||
|
||||
state 9
|
||||
|
||||
(4) attribute -> SIZE .
|
||||
|
||||
KIND reduce using rule 4 (attribute -> SIZE .)
|
||||
COLOR reduce using rule 4 (attribute -> SIZE .)
|
||||
MATERIAL reduce using rule 4 (attribute -> SIZE .)
|
||||
SIZE reduce using rule 4 (attribute -> SIZE .)
|
||||
|
||||
|
||||
state 10
|
||||
|
||||
(6) article -> attribute article .
|
||||
|
||||
$end reduce using rule 6 (article -> attribute article .)
|
||||
|
36
wyklady/parsetab.py
Normal file
36
wyklady/parsetab.py
Normal file
@ -0,0 +1,36 @@
|
||||
|
||||
# parsetab.py
|
||||
# This file is automatically generated. Do not edit.
|
||||
# pylint: disable=W,C,R
|
||||
_tabversion = '3.10'
|
||||
|
||||
_lr_method = 'LALR'
|
||||
|
||||
_lr_signature = 'COLOR KIND MATERIAL NUMBER OPERATE SIZEcommand : OPERATE NUMBER articleattribute : COLORattribute : MATERIALattribute : SIZEarticle : KINDarticle : attribute article'
|
||||
|
||||
_lr_action_items = {'OPERATE':([0,],[2,]),'$end':([1,4,5,10,],[0,-1,-5,-6,]),'NUMBER':([2,],[3,]),'KIND':([3,6,7,8,9,],[5,5,-2,-3,-4,]),'COLOR':([3,6,7,8,9,],[7,7,-2,-3,-4,]),'MATERIAL':([3,6,7,8,9,],[8,8,-2,-3,-4,]),'SIZE':([3,6,7,8,9,],[9,9,-2,-3,-4,]),}
|
||||
|
||||
_lr_action = {}
|
||||
for _k, _v in _lr_action_items.items():
|
||||
for _x,_y in zip(_v[0],_v[1]):
|
||||
if not _x in _lr_action: _lr_action[_x] = {}
|
||||
_lr_action[_x][_k] = _y
|
||||
del _lr_action_items
|
||||
|
||||
_lr_goto_items = {'command':([0,],[1,]),'article':([3,6,],[4,10,]),'attribute':([3,6,],[6,6,]),}
|
||||
|
||||
_lr_goto = {}
|
||||
for _k, _v in _lr_goto_items.items():
|
||||
for _x, _y in zip(_v[0], _v[1]):
|
||||
if not _x in _lr_goto: _lr_goto[_x] = {}
|
||||
_lr_goto[_x][_k] = _y
|
||||
del _lr_goto_items
|
||||
_lr_productions = [
|
||||
("S' -> command","S'",1,None,None,None),
|
||||
('command -> OPERATE NUMBER article','command',3,'p_command','3.py',88),
|
||||
('attribute -> COLOR','attribute',1,'p_attribute_color','3.py',110),
|
||||
('attribute -> MATERIAL','attribute',1,'p_attribute_material','3.py',117),
|
||||
('attribute -> SIZE','attribute',1,'p_attribute_size','3.py',124),
|
||||
('article -> KIND','article',1,'p_article_kind','3.py',131),
|
||||
('article -> attribute article','article',2,'p_article_attribute','3.py',138),
|
||||
]
|
Loading…
Reference in New Issue
Block a user