2014-12-23 6 views
0

나는 약간의 도움이 필요하다. 나는 int, 어떤 수학 연산, 어떤 숫자 및 = 표지판을 내 코드에 잡기 위해 몇 가지 Regex 표현식을 만들려고 노력하고있다. 나머지는 모두 무시한다. 무시할 단어는 false로 설정되고 다른 단어는 아래 코드와 같이 true로 설정됩니다.복잡한 정규식

정수 오버플로를 감지 할 수있는 Lexer를 구현하기 위해 위에서 언급 한 키워드를 토큰 화하는 데 사용됩니다. 나는 이것을 Regex와 독점적으로해야합니다.

나는 이미 단어 int, 수학 연산 및 자릿수를 성공적으로 캡처했지만 내 Regex은 임의의 단어를 인식하지 못하는 것 같습니다. 같은

 lexer.AddDefinition(new TokenDefinition(
      "(operator)", 
      new Regex(@"\*|\/|\+|\-"), 
      false)); 

     lexer.AddDefinition(new TokenDefinition(
      "(literal)", 
      new Regex(@"\d+"), 
      false)); 

     lexer.AddDefinition(new TokenDefinition(
      "(Random Word)", 
      new Regex(@"(?=.*[A-Z])(?=.*[a-z])"), 
      false)); 

     lexer.AddDefinition(new TokenDefinition(
      "(integer)", 
      new Regex(@"\bint\b"), 
      false)); 

     lexer.AddDefinition(new TokenDefinition(
      "(white-space)", 
      new Regex(@"\s+"), 
      true)); 


     // This is not working. Random words such as variable names are not being captured by this. 
     lexer.AddDefinition(new TokenDefinition(
      "(random-word)", 
      new Regex(@"\b(?=.*[A-Z])(?=.*[a-z])\b"), 
      true)); 

     // What about the brackets? How can I implement a Regex to capture brackets? 

이 그렇게 단순하게 보이지만 내가 할 수있는 등 등 ... 문, 둥근 괄호, 중괄호, 것처럼 변수 이름 (숫자 1, 숫자 2, 등) 및 언어 내부에 다른 단어로 끝내지 마. 의견을 공유하십시오. 의견을 환영합니다.

+0

설명을 위해 편집 됨. – ClaireG

+1

LL (1) 파사 - 생성기 (coco/r 또는 이와 유사)를 사용하는 것에 대해 생각해 보셨습니까? http://www.thefreecountry.com/programming/compilerconstruction.shtml – TGlatzer

+0

고마워, 저것 좀 봐야 겠어. – ClaireG

답변

2

\b(?=...)은 모두 길이가 0입니다. 다른 말로하면 그들은 아무 것도 포착하지 않고, 조건을 선언하고 그 조건이 충족되지 않으면 정규 표현식이 실패합니다.

난 당신이 "임의의 단어"하지만 변수는 C#으로 나는이 할 것 생겼는지에가는 의미 정확하게 확실 해요 :이 단어 경계와 일치

\b[a-zA-Z_]\w*\b 

을, 다음 편지 또는 밑줄 뒤에 0 개 이상의 문자/밑줄/숫자가 있고 단어 경계로 끝나는 문자. 댓글 후

작은 업데이트 :이 비 ASCII 문자 문제를 제공하지 않으며, 이미 다른 TokenDefiner에 의해 처리됩니다 int 일치하지 않습니다.

\b(?!int)[a-zA-Z_][a-zA-Z0-9_]*\b 
+0

아주 좋았지 만'\ w'도 비 ASCII 문자/숫자와 일치한다는 것에주의해라. 원하지 않을 수도 있습니다. –

+0

사과드립니다. "임의의 단어"는 문맥에 어긋납니다. 내가 의미하는 바는 다른 키워드 인 int, + * -/= 및 임의의 숫자입니다. 근본적으로 arithmentics 및 정수와 관련이있는 것 이외의 다른 것. – ClaireG

+0

기본적으로 TokenDefiniton 내부에는 문자열 소스와 일치하는 메서드가 있으며 'int', 수학 피연산자, 등호 또는 임의의 숫자가있는 곳을 지적합니다. 나머지는 무시해야하지만 예외를 잡으려면 정규 표현식과 "다른 단어"를 일치시켜야합니다. – ClaireG

관련 문제