2013-05-16 2 views
0

간단한 정규 표현식을 표현하기 위해 문맥 자유 문법을 만들려고합니다. 내가 원하는 기호는 [0-9] [a-z] [A-Z]이고 연산자는 "|", "()"및 "."입니다. "?":정규 표현식을 나타내는 문맥 자유 문법

void RE(): {} 
{ 
    FINAL(0) ("." FINAL(0) | "|" FINAL(0))* 
} 

void FINAL(int sign): { Token t; } 
{ 
    t = <SYMBOL> { 
     if (sign == 1) 
      jjtThis.val = t.image + "*"; 
     else 
      jjtThis.val = t.image; 
    } 
    | FINAL(1) "*" 
    | "(" RE() ")" 
} 

문제는 FINAL 기능 라인에 연결을위한, 그리고 "+", 등 "*"나중에 내가 추가 할 것입니다 지금은 원하는에 대한 시퀀스 나는 JavaCC에이 문법을 시도 | FINAL(1) "*"은 오류 Left recursion detected: "FINAL... --> FINAL...을 제공합니다. FINAL (1)의 왼쪽에 "*"를 넣으면 문제가 해결되지만 이것은 내가 원하는 것이 아닙니다.

위키피디아에서 왼쪽 재귀를 제거하기 위해 이미 기사를 읽으려고했으나 실제로 어떻게해야할지 모르겠습니다. 누군가 도와 줄 수 있니? :의

+1

정규 표현식에 대한 문법을 ​​만들려고하십니까? 아니면 특정 정규 표현식과 동일한 언어와 일치합니까? 당신이 묻는 것은 정말로 분명하지 않습니다. 언어가 아닌 언어로 단어의 예를 제공하십시오. – bengoesboom

+0

정규 표현식에 대한 문법을 ​​만들려고하는데 아주 간단합니다. '(a * | b) .c, c | a, a.c *, 1 | 2, 1.3, etc.'과 같이 받아 들여지기를 원하는 단어의 예가 있습니다. 내가 받아들이기를 원하지 않는 단어는 올바른 형식을 따르지 않는 것입니다 : 예를 들어, 'a ** b, a || b, a..b, a ((b) 등' – pedroh

+0

[Context- 무료 문법 정규 표현식을 설명?] (http://stackoverflow.com/questions/977884/context-free-grammar-describing-regular-expressions) – Kevin

답변

1

다음은 제공하지 않습니다 왼쪽 재귀 그러나

RE --> FACTOR ("." FINAL | "|" FINAL)* 
FINAL --> PRIMARY ("*")* 
PRIMARY --> <SYMBOL> | "(" RE ")" 

, 처리한다. 우선 순위 | . 이를 위해 다음과 같은

RE --> TERM ("|" TERM)* 
TERM --> FINAL ("." FINAL)* 
FINAL --> PRIMARY ("*")* 
PRIMARY --> <SYMBOL> | "(" RE ")" 

일반적인 규칙은

A --> A b | c | d | ... 

B는 새로운 nonnterminal입니다
A --> B b* 
B --> c | d | ... 

로 변환 할 수있다 할 수 있습니다.

+0

내 문제를 해결해 줘서 고마워! – pedroh