2011-01-18 5 views
8

Word, Number, String, RegExp, Operator, Comment 및 Newline과 같은 기본 유형을 탐지하는 간단한 javascript 토크 나이저를 작성합니다. 다 잘되고 있지만 현재 문자가 RegExp 구분 기호 또는 나누기 연산자인지 검색하는 방법을 이해할 수 없습니다. 너무 느리기 때문에 정규식을 사용하지 않습니다. 아무도 그것을 감지하는 메커니즘을 알고 있습니까? 감사.토큰 화 중에 나누기/RegExp 충돌

답변

6

스트림에서 이전 토큰이 무엇인지 알 수 있습니다. 렉서가 발행하는 각 토큰을 살펴보고 구분 기호 나 정규 표현식이 합리적으로 따라 올 수 있는지 여부를 묻습니다. 두 개의 결과 집합의 토큰이 서로 떨어져 있다는 것을 알 수 있습니다. 예를 들어, (, [, {, ; 및 모든 2 진수 연산자의 경우에만 정규식을 사용할 수 있습니다. 마찬가지로 ), ], }, 식별자 및 문자열/숫자 리터럴 뒤에는 구분 기호가 올 수 있습니다.

자세한 내용은 ECMAScript spec의 섹션 7을 참조하십시오.

+2

에 대한

나는 한 번 토크 나이를 쓰고, 다음은 "정규식 트리거를"감지 된 RE 있습니다 :'/ [{(\ [;,] /''/ \ + \ + | -? ~ | && | \? | : | \\ $ | (<<|> >>? ==? |! =? | [- <> + * % & \ | \^/]) =? /''/^(? = \ s | \/| user123444555621

+4

기술적으로는 어쩔 수없는 몇 가지 모호성이 있습니다. 예를 들어'(a + b)/c'와'if (x) /foo/.exec ('bar')'(close-paren 앞에 둘 수있다.) 또한 ++/foo/.abc'와'a ++/b' (plus + plus 앞에 둘 수 있습니다.)와 함께'--'는 내가 아는 유일한 것들입니다. – dgreensp

+0

@dgreensp 감사합니다. 유용한 관찰 !!! – Zo72

1

슬래시가 발생하면 컨텍스트를 확인해야합니다. 슬래시가 표현식 뒤에 있다면, 그것은 나누기 여야합니다, 또는 정규식 시작입니다.

문맥을 인식하기 위해서는 어쩌면 구문 분석기를 만들어야합니다. 예를

function f() {} 
/1/g 
//this case ,the slash is after a function definition, so it's a refexp start 


var a = {} 
/1/g; 
//this case, the slash is after an object expression,so it's a division 
관련 문제