홈>
현재 PLY (Python Lex-Yacc)를 사용하여 불화 봇용 계산기를 작성하고 있습니다. . 문제는 코드를 컴파일 할 수 없다는 것입니다.
구문 오류가 발생합니다 :
Traceback (most recent call last): File "main.py", line 6, in <module>
import calculator
File "/home/runner/calculator.py", line 72, in <module> lexer=lex()
File "/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/ply/lex.py"
, line 909, in lex raise SyntaxError("Can't build lexer")
SyntaxError: Can't build lexer
내 코드는 다음과 같습니다 :
from ply.lex import lex
from ply.yacc import yacc
from decimal import *
setcontext(Context(prec=2000,rounding=ROUND_HALF_DOWN))
factorial=[1]
fac=Decimal('1')
for i in range(2,1000):
fac*=Decimal(i)
factorial.append(fac)
def sin(s):
sin=Decimal(s)
s=Decimal(s)
for i in range(5,1000,4):
sin+=(Decimal((s**Decimal(i)))/Decimal(factorial[i-1]))
for i in range(3,1000,4):
sin-=(Decimal((s**Decimal(i)))/Decimal(factorial[i-1]))
return sin
def cos(s):
cos=Decimal('1')
s=Decimal(s)
for i in range(4,1000,4):
cos+=(Decimal((s**Decimal(i)))/Decimal(factorial[i-1]))
for i in range(2,1000,4):
cos-=(Decimal((s**Decimal(i)))/Decimal(factorial[i-1]))
return cos
def tan(s):
return sin(s)/cos(s)
tokens=['NUM','PLUS','MINUS','TIMES','DIVIDE','LPAREN','RPAREN','SIN','COS','TAN']
#tokens=['NUM','PLUS','MINUS','TIMES','DIVIDE','LPAREN','RPAREN', 'SIN']
t_ignore=' \t\n'
t_PLUS=r'\+'
t_MINUS=r'\-'
t_TIMES=r'\*'
t_DIVIDE=r'/'
t_LPAREN=r'\('
t_RPAREN=r'\)'
t_SIN=r'sin'
t_COS=r'cos'
t_TAN=r'tan'
def t_NUM(t):
r'\d+(\.\d+)?'
t.value=Decimal(t.value)
return t
def t_SIN(t):
r'sin\((\d+(\.\d+)?)\)'
t.value=sin(Decimal(t))
return t
def t_COS(t):
r'cos\((\d+(\.\d+)?)\)'
t.value=cos(Decimal(t))
return t
def t_TAN(t):
r'tan\((\d+(\.\d+)?)\)'
t.value=tan(Decimal(t))
return t
def t_error(t):
print('Bad Character: {!r}'.format(t.value[0]))
t.lexer.skip(1)
lexer=lex()
def p_expr(p):
'''
expr : expr PLUS term
| expr MINUS term
'''
if p[2]=='+':
p[0]=p[1]+p[3]
elif p[2]=='-':
p[0]=p[1]-p[3]
def p_expr_term(p):
'''
expr : term
'''
p[0]=p[1]
def p_term(p):
'''
term : term TIMES factor
| term DIVIDE factor
'''
if p[2]=='*':
p[0]=p[1]*p[3]
elif p[2]=='/':
p[0]=p[1]/p[3]
def p_term_factor(p):
'''
term : factor
'''
p[0]=p[1]
def p_factor(p):
'''
factor : NUM
'''
p[0]=p[1]
'''
def p_factor(p):
factor : SIN
| COS
| TAN
if p[0]=='sin':
p[0]=Decimal(sin(Decimal(p[1])))
elif p[0]=='cos':
p[0]=Decimal(cos(Decimal(p[1])))
elif p[0]=='tan':
p[0]=Decimal(sin(Decimal(p[1]))/cos(Decimal(p[1])))
p[0]=p[1]
'''
def p_factor_group(p):
'''
factor : LPAREN expr RPAREN
'''
p[0]=p[2]
def p_error(p):
if p:
print("Syntax error at '%s'" % p.value)
else:
print("Syntax error at EOF")
#if __name__ == '__main__':
parser=yacc()
문제는
sin/cos/tan
에 관한 것 같아요
부분, 그러나 나는 그것을 고치지 못했습니다.
누구든지 나를 도울 수 있습니까?
- 답변 # 1
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
이것이 주요 문제인지 확실하지 않지만 일부 토큰을 두 번 정의하십시오.
처음 :
두 번째 시간 :
첫 번째 정의를 제거하면 오류없이 실행할 수 있습니다.
<시간>수정 :사용하려고하면
<시간>1+2
와 같은 값을 추가 할 수 있습니다. 그러나sin(9)
에 문제가 있습니다 . 나도t_SIN
텍스트sin(...)
만 인식해야합니다. 그러나 그것을 계산할 수 없었습니다. 파서는 값을 계산해야합니다.해야합니다
<시간>전체 코드