2015-01-21 5 views
0

python에 익숙하지 않고 정규 표현식과 EBNF를 사용하려고합니다. 내 전환이 정확한지 확실하지 않습니다. 어떤 도움을 주시면 감사하겠습니다. 나는 단지 내 전환을 두 번째 봐야합니다.Regex-EBNF coversion issue python

EBNF          REGEX 
a{a} (convereted from regex)    a+ 

a{{ab} ya} (convereted from regex)  a((xa)*ya) 

e{e}{bb|p[p] [p]d}c      e+(bb|(p)*d)?c  
+0

정확히 무엇입니까? 해당 컨텍스트에서 열 1의 표현식이 열 2와 동일합니까? – NeronLeVelu

+0

@ NeronLeVelu..Yes..for the first two..ebnf는 정규 표현식과 같으며 마지막 문장은 ebnf와 같은 정규 표현식입니다. 수정이 도움이 될 것입니다. 감사 –

답변

1

EBNF의 기능은 간단하지만 실제 표기법은 몇 가지 다른 형태로 나타날 수 있습니다. 나는 ISO/IEC 14977 : 1996(E)이라는 용어와 표기법을 사용할 것입니다 (Google을 사용하는 경우 PDF로 제공됨).

정규식 a+은 터미널 문자열 (§5.2) 다음에 반복 시퀀스 (§5.6)가옵니다. EBNF 형식은 다음과 같습니다

"a", {"a"} 

정규 표현식 a((xa)*ya)은 좀 더 복잡하다. 처음에 a(ya) 만 보면 터미널 문자열 뒤에 그룹화 된 시퀀스 (§5.4)가 있습니다. 그 결과는 다음과 같습니다

"a", ("y", "a") 

자체로 표현식 (xa)*는 두 개의 터미널 - 문자열의 시퀀스를 포함하는 반복 시퀀스입니다. 그것은 혼자과 같습니다

{"x", "a"} 

당신은 완전한 표현의 EBNF 양식을 얻기 위해 앞의 두 항목을 결합 할 수 있습니다 : 마지막 표현은 두 개의 추가 개념을 소개

"a", ({"x", "a"}, "y", "a") 

을 구체적으로 정의 - 목록 (§5.10)과 선택 - 순서 (§5.5). 서브 표현 (bb|(p)*d)에는 정의 목록이 있습니다. 혼자 표현식에 대한 EBNF는 다음과 같이 옵션 때문에

[("b", "b" | {"p"}, "d")] 

: 당신이 표현식 (bb|(p)*d)?이 확장 옵션 정량을 포함하면

("b", "b" | {"p"}, "d") 

, 다음에 EBNF를 업데이트 시퀀스는 그룹화 구성의 역할을하므로 불필요한 시작 그룹 기호 및 끝 그룹 기호를 제거하여 다음을 얻을 수 있습니다.

["b", "b" | {"p"}, "d"] 

위에서 사용 된 단계를 결합하여 세 번째 정규 표현식에 대한 EBNF 양식을 얻을 수 있습니다.

"e", {"e"}, ["b", "b" | {"p"}, "d"], "c"