>

현재 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

    이것이 주요 문제인지 확실하지 않지만 일부 토큰을 두 번 정의하십시오.

    처음 :

    t_SIN=r'sin'
    t_COS=r'cos'
    t_TAN=r'tan'
    
    

    두 번째 시간 :

    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
    
    

    첫 번째 정의를 제거하면 오류없이 실행할 수 있습니다.

    <시간>

    수정 :사용하려고하면 1+2 와 같은 값을 추가 할 수 있습니다.  그러나 sin(9) 에 문제가 있습니다 . 나도 t_SIN  텍스트 sin(...) 만 인식해야합니다.  그러나 그것을 계산할 수 없었습니다. 파서는 값을 계산해야합니다.

    <시간>

    해야합니다

    t_SIN=r'sin'
    def p_sin(p):
        '''
        term : SIN LPAREN expr RPAREN
        '''
        #print('p:', p[0], p[1], p[2], p[3], p[4])
        p[0] = sin(p[3])
    
    

    <시간>

    전체 코드

    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_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_sin(p):
        '''
        term : SIN LPAREN expr RPAREN
        '''
        #print('p:', p[0], p[1], p[2], p[3], p[4])
        p[0] = sin(p[3])
    def p_cos(p):
        '''
        term : COS LPAREN expr RPAREN
        '''
        #print('p:', p[0], p[1], p[2], p[3], p[4])
        p[0] = cos(p[3])
    def p_tan(p):
        '''
        term : COS LPAREN expr RPAREN
        '''
        #print('p:', p[0], p[1], p[2], p[3], p[4])
        p[0] = tan(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()
    while True:
        try:
            s = input('calc > ')
        except EOFError:
            break
        if not s: continue
        result = parser.parse(s)
        print(result)
    
    

  • 이전 tableau js api - 필터에 설정된 경우 "모두"필터 값을 얻는 방법
  • 다음 html - 요소 이름 데이터 스크래핑을 추출하는 방법