2014-05-16 3 views
0

PLAY를 사용한 정규 표현식을 작성하고 있지만 yacc처럼 작동하지 않는 것으로 보입니다.PLAY를 사용하는 yacc 코드의 정규 표현식

나는이 서면으로 작성했습니다 : 이산, 또는 연속 :

def p_expression_TYPE (p): 
''' 
    TYPE : [' Discrete ', ' Continuous ' ] 
''' 

은 TYPE은 그 값을 가질 수 있다는 사실을 표현.

나는 다음 오류가 :

ERROR: la_grammaire_yacc.py:31: Illegal name '['' in rule 'TYPE' 

누군가가 내 코드에 문제가 있는지 말해 줄 수 있을까요? 토큰처럼 표현의 왕을 분명히 지정해야합니까? 당신

답변

1

정규 표현식 및 yacc에에

덕분에 동물의 종류입니다. difference between Chomsky Type 3 and Chomsky type 2 languages을 이해하는 데 도움이됩니다. 플렉스에서 사용되는 정규 표현식과 PLY의 어휘 분석 부분은 Chomsky 유형 3입니다. Yacc 및 PLY의 문법 규칙 부분은 촘스키 유형 2 인 문맥 자유 문법입니다.

다른 목적, 다른 특성 및 다른 표기법. 결과적으로 당신은 짧은 손이나 하나에서 다른 규칙을 취할 수 없습니다. 그러나 정규 표현식으로 작성할 수있는 모든 것을 문맥 자유 문법으로 처리 할 수 ​​있습니다. 그냥 다르게 쓰여졌습니다. (단지 약간의 컴퓨터 과학 이론이 거기에 들어온다).

good manual on PLY, which has similar examples과 상담 할 필요가 있습니다.

따라서, 귀하의 예를 들어, 구문 규칙이 작성 될 수 있습니다

불행하게도
def p_expression_TYPE (p): 
''' 
    TYPE : 'Discrete' 
     | 'Continuous' 
''' 

은 PLY는 'Discrete''Continuous' 같은 문자 리터럴는 렉스의 토큰으로 선언해야하는 제한이 부분 :

import ply.lex as lex 

# List of token names. This is always required 
tokens = (
    'DISCRETE', 
    'CONTINUOUS' 
) 

# Regular expression rules for simple tokens 
t_DISCRETE = r'Discrete' 
t_CONTINUOUS = r'Continuous' 

이제 우리는

def p_expression_TYPE (p): 
''' 
    TYPE : DISCRETE 
     | CONTINUOUS 
''' 
로 yacc.py에 파서를 넣을 수 있습니다