Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
Alligators-python
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Benjamin Monmege
Alligators-python
Commits
9fff4adf
Commit
9fff4adf
authored
3 years ago
by
Antonio MATTAR
Browse files
Options
Downloads
Plain Diff
Merge branch 'main' of
https://gitlab.lis-lab.fr/benjamin.monmege/alligators-python
parents
b262e744
6b154c61
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
parser.py
+38
-13
38 additions, 13 deletions
parser.py
with
38 additions
and
13 deletions
parser.py
+
38
−
13
View file @
9fff4adf
from
main
import
*
from
main
import
*
# TERME = input('Please enter a Lambda-Term: ')
# TERME = input('Please enter a Lambda-Term: ')
#renvoie conteur le nombre de parentheses ouvertes et indexes la liste des indices des parenthese)
def
open_parantheses_counter
(
terme
):
def
open_parantheses_counter
(
terme
):
counter
=
0
counter
=
0
indexes
=
[]
indexes
=
[]
...
@@ -8,7 +9,7 @@ def open_parantheses_counter(terme):
...
@@ -8,7 +9,7 @@ def open_parantheses_counter(terme):
counter
+=
1
counter
+=
1
indexes
.
append
(
i
)
indexes
.
append
(
i
)
return
(
counter
,
indexes
)
return
(
counter
,
indexes
)
# comme celle d avant
def
close_parantheses_counter
(
terme
):
def
close_parantheses_counter
(
terme
):
counter
=
0
counter
=
0
indexes
=
[]
indexes
=
[]
...
@@ -24,7 +25,7 @@ def equal_parantheses(terme):
...
@@ -24,7 +25,7 @@ def equal_parantheses(terme):
open_list
=
[
"
[
"
,
"
{
"
,
"
(
"
]
open_list
=
[
"
[
"
,
"
{
"
,
"
(
"
]
close_list
=
[
"
]
"
,
"
}
"
,
"
)
"
]
close_list
=
[
"
]
"
,
"
}
"
,
"
)
"
]
#
Function to check parentheses
#
teste si toutes les ouvertes ont ete fermees et quil n y a pas par exemple le cas )(...
def
balancedParantheses
(
terme
):
def
balancedParantheses
(
terme
):
stack
=
[]
stack
=
[]
for
i
in
terme
:
for
i
in
terme
:
...
@@ -37,13 +38,16 @@ def balancedParantheses(terme):
...
@@ -37,13 +38,16 @@ def balancedParantheses(terme):
stack
.
pop
()
stack
.
pop
()
else
:
else
:
return
False
return
False
return
len
(
stack
)
==
0
if
len
(
stack
)
==
0
:
return
True
else
:
return
False
#renvoie le nombre de parentheses ouvertes qui est aussi le nombre de couples de parenthèses que le terme compte
def
parantheses_couples
(
terme
):
def
parantheses_couples
(
terme
):
assert
balancedParantheses
(
terme
),
"
Not balanced Terme
"
assert
balancedParantheses
(
terme
),
"
Not balanced Terme
"
return
(
open_parantheses_counter
(
terme
)[
0
])
return
(
open_parantheses_counter
(
terme
)[
0
])
# on lui donne l indice dune parenthese ouverte et renvoie l indice de la parenthese fermante
def
findClosingParanthesesIndex
(
terme
,
openParentheseIndex
):
def
findClosingParanthesesIndex
(
terme
,
openParentheseIndex
):
assert
balancedParantheses
(
terme
),
"
Not balanced Terme
"
assert
balancedParantheses
(
terme
),
"
Not balanced Terme
"
closeParantheseIndex
=
openParentheseIndex
closeParantheseIndex
=
openParentheseIndex
...
@@ -58,7 +62,7 @@ def findClosingParanthesesIndex(terme, openParentheseIndex):
...
@@ -58,7 +62,7 @@ def findClosingParanthesesIndex(terme, openParentheseIndex):
return
closeParantheseIndex
return
closeParantheseIndex
def
checkType
(
terme
):
def
checkType
(
terme
):
if
parantheses_couples
(
terme
)
>=
2
and
terme
[
0
]
==
'
(
'
and
terme
[
-
1
]
==
"
)
"
and
balancedParantheses
(
terme
):
if
terme
[
0
]
==
'
(
'
and
balancedParantheses
(
terme
):
return
APP
return
APP
elif
"
#
"
==
terme
[
0
]:
elif
"
#
"
==
terme
[
0
]:
return
ABS
return
ABS
...
@@ -75,7 +79,7 @@ def isApplication(terme):
...
@@ -75,7 +79,7 @@ def isApplication(terme):
return
checkType
(
terme
)
==
APP
return
checkType
(
terme
)
==
APP
#on prend l input de labs en chaine de caractères
def
parseInputFromAbs
(
terme
):
def
parseInputFromAbs
(
terme
):
input
=
''
input
=
''
if
checkType
(
terme
)
==
ABS
:
if
checkType
(
terme
)
==
ABS
:
...
@@ -84,7 +88,7 @@ def parseInputFromAbs(terme):
...
@@ -84,7 +88,7 @@ def parseInputFromAbs(terme):
input
+=
terme
[
i
]
input
+=
terme
[
i
]
i
+=
1
i
+=
1
return
input
return
input
# on prend l output en chaine de caractères
def
parseOutputFromAbs
(
terme
):
def
parseOutputFromAbs
(
terme
):
output
=
''
output
=
''
if
checkType
(
terme
)
==
ABS
:
if
checkType
(
terme
)
==
ABS
:
...
@@ -113,12 +117,18 @@ def buildApp(terme):
...
@@ -113,12 +117,18 @@ def buildApp(terme):
t
=
new_app
(
t
,
buildTerm
(
liste_de_termes
[
k
]))
t
=
new_app
(
t
,
buildTerm
(
liste_de_termes
[
k
]))
return
t
return
t
A
=
"
#x.(x)(y)
"
def
buildTerm
(
terme
):
def
buildTerm
(
terme
):
TermType
=
checkType
(
terme
)
TermType
=
checkType
(
terme
)
if
isVariable
(
terme
):
return
buildVar
(
terme
)
if
isVariable
(
terme
):
return
buildVar
(
terme
)
elif
isAbstraction
(
terme
):
return
buildAbs
(
terme
)
elif
isAbstraction
(
terme
):
return
buildAbs
(
terme
)
elif
isApplication
(
terme
):
return
buildApp
(
terme
)
elif
isApplication
(
terme
):
return
buildApp
(
terme
)
# renvoie les espaces laissés au debut et a la fin du terme ( ils servent a rien)
def
remove_first_and_last_spaces
(
terme
):
def
remove_first_and_last_spaces
(
terme
):
new_terme
=
list
(
terme
)
new_terme
=
list
(
terme
)
i
=
0
i
=
0
...
@@ -131,15 +141,18 @@ def remove_first_and_last_spaces(terme):
...
@@ -131,15 +141,18 @@ def remove_first_and_last_spaces(terme):
j
-=
1
j
-=
1
return
""
.
join
([
str
(
letter
)
for
letter
in
new_terme
])
return
""
.
join
([
str
(
letter
)
for
letter
in
new_terme
])
# enleve les parentheses quand y a un seul coupme
def
remove_inutile_parentheses
(
terme
):
def
remove_inutile_parentheses
(
terme
):
if
parantheses_couples
(
terme
)
==
1
:
if
parantheses_couples
(
terme
)
==
1
:
return
terme
[
+
1
:
findClosingParanthesesIndex
(
terme
,
0
)]
return
terme
[
1
:
-
1
]
# tout sauf le premier et dernier
terme
else
:
else
:
return
terme
return
terme
# renvoie ce qu'il y a entre la parenthese ouverte a l indice i et sa parethese fermante
def
getTermFromParantheses
(
terme
,
i
):
def
getTermFromParantheses
(
terme
,
i
):
return
terme
[
i
+
1
:
findClosingParanthesesIndex
(
terme
,
i
)]
return
terme
[
i
+
1
:
findClosingParanthesesIndex
(
terme
,
i
)]
# renvoie renvoie tous les termes entre parentheses dans terme
def
getTermsFromParantheses
(
terme
):
def
getTermsFromParantheses
(
terme
):
terms
=
[]
terms
=
[]
for
i
in
(
open_parantheses_counter
(
terme
)[
1
]):
for
i
in
(
open_parantheses_counter
(
terme
)[
1
]):
...
@@ -147,4 +160,16 @@ def getTermsFromParantheses(terme):
...
@@ -147,4 +160,16 @@ def getTermsFromParantheses(terme):
return
terms
return
terms
def
cleaner
(
terme
):
print
(
getTermsFromParantheses
(
"
(AAAAAA)(BBBBBBBBB)(CCCCCCCCC)
"
))
\ No newline at end of file
print
(
buildTerm
(
A
))
print
(
remove_first_and_last_spaces
(
'
ll
'
))
print
(
isAbstraction
(
A
))
print
(
isApplication
(
"
(x)(y)(z)
"
))
print
(
checkType
(
"
(#x.x)
"
))
print
(
buildTerm
(
'
(#x.x)(#y.y)
'
))
print
(
remove_inutile_parentheses
(
'
(#x.x)(#y.y)
'
))
# print(open_parantheses_counter('((((((((((('))
# print(close_parantheses_counter('((((((((((()'))
# print(buildAbs("#x.ABC"))
# print(checkType("(#x.xx)(fds)"))
# print(findClosingParanthesesIndex('()',0))
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment