2016-09-30 2 views
0

플렉스에서,이 같은 이름 정의에 후행 패턴을 사용할 수 있습니다.

하지만 공백없이 정규 표현식을 쓰는 것을 좋아하지 않습니다. 읽기 어렵 기 때문입니다.

NAME (?x: foo$ | bar) 

을하지만 지금은 설명서, "‘$’, cannot be grouped inside parentheses"에 따르면 때문에 플렉스 실패 : 그래서 제대로 할 싶습니다.

IMHO, 이것은 약간의 구조를 허용하지만 바르게 설명 할 수는 없도록 어리석은 행위입니다.

어떻게 Flex에서 읽을 수있는 패턴으로 후행 컨텍스트를 사용할 수 있습니까?

답변

1

첫 번째 질문에 대답하기 : "어떻게 Flex에서 읽을 수있는 패턴으로 후행 컨텍스트를 사용할 수 있습니까?" 공백으로 뿌려 놓은 패턴 만 읽을 수 있다고 주장한다면 대답은 입니다. "할 수 없습니다." 미안하지만, 그것이 그 방법입니다. 어떤 시점에서 (?x: 플래그가 플렉스 해킹되어 여전히 거친 가장자리가 많이 있습니다.

r|s 정규 표현식에서 $ 연산자를 하나의 대안으로 사용할 수 없으므로 중요하지 않습니다. 따라서 "읽을 수있는 구문"을 사용할 수 있다고해도 의도 한 바를 의미하지는 않습니다. 확실히 다음과 같은 "읽을 수있는 구문"을 사용할 수 있습니다 (적어도 읽을 수는 있습니다). 그것은 뭔가 다른 것을 의미하지만, 그것은 플렉스가 지원하는 $ 운영자의 유일한 소용이 : 아래

NAME (?x: foo | bar)$ 

몇 가지 사항입니다.


플렉스에서,이 같은 이름 정의에 후행 패턴을 사용할 수 있습니다

NAME foo$|bar 

아니, 당신은 할 수 없습니다. 또는 더 나은 말했다, 당신은 쓸 수 있지만 컨텍스트를 후행 포함하지 않는 이유는

중 & hellip; 규칙의 끝에서 발생하지 않는 '$'는 특별한 속성을 잃게하고로 처리됩니다 정상적인 성격.

,

그 플렉스가 거부 사실 (약간 호기심)입니다합니다 (Flex manual에서 당신이 괄호 안에 컨텍스트 연산자를 후행 넣을 수 없다는 점에서 마지막 문구입니다.) 그것은

NAME (?x: foo$ | bar) 

을 받아 들일 것입니다 있지만 :

NAME (?x: foo$| bar) 

나는 사지에 나가서 것 그것이 버그라고 말하라.$은 패턴 끝에있는 경우에만 후행 컨텍스트 연산자로 인식됩니다. 그러나 검사하는 코드는 패턴이 첫 번째 공백 문자로 끝나기 때문에 단순히 다음 문자가 공백인지 검사합니다. (패턴은 정의에 해석되는 것이 아니라 실제로 어떤 규칙 패턴에 포함되는 경우가 파싱된다.) 시험은 $(?x: 블록 내에 있는지 여부를 확인하지 않고,

(?x: foo$ | bar) 

너무 에서의 $ 인 평범한 문자

(?x: foo$| bar) 
이다

동안 $가 (오퍼레이터가 패턴의 끝 나타나야) 구문 오류가 후행 컨텍스트 연산자이며 적법한 그러나 아마도 예기치 않게. 마지막으로


, 약간의주의 사항 :

다음 완전히 법률과 $가, 뒤에 컨텍스트 연산자로 처리됩니다 는 정의가 패턴의 맨 끝에 사용되어 제공됩니다
NAME bar|foo$ 

그러나 아마도 그것이 의미하는 바를 의미하지는 않습니다. 후행 컨텍스트 연산자는 너무 오래 확장이 패턴의 끝에있는 한, 그는이

NAME (bar|foo)$ 

내가 강하게 정의를 사용하여에 추천 할 것입니다 기록 된 것처럼 구문 분석, 배타 연산자보다 우선 순위가 . (실제로 이러한 모든 단점 때문에 부분적으로 정의의 사용을 권장하지 않습니다.) $의 정의는 괄호로 묶지 않고 참조 패턴에 삽입됩니다 (따라서 $을 처리 할 수 ​​있음). 연산자로). 이것은 모든 종류의 예기치 않은 행동으로 이어집니다. 사용 후

NAME bar|foo$ 

과 : 예를 들어, 당신은 쓰기

x{NAME}y  /* Some action */ 

최종 결과는

xbar|foo"$"y /* Some action */ 

(없음 괄호를 작성 없었던 것처럼 될 것입니다,하지만 $은 일반 문자입니다.)

한편

,이처럼 사용하는 경우 : 당신이 쓴 것처럼입니다

x{NAME}  /* Some action */ 

xbar|foo$  /* Some action */ 
$가 후행 컨텍스트 연산자 인

하지만 때문에 해당 연산자의 우선 순위가 낮 으면

(xbar|foo)$ /* Some action */ 

이러한 확장이 원했던 일은 거의 없었을 것이며, 코드를 읽는 사람은 그 결과를 기대할 가능성이 적습니다.

+0

감사합니다. 매우 유익합니다. 내가이 질문을 쓴 후에, 나는 당신이 쓴 글을 깨달았고, 뒤 따르는 문맥은 정의 안에서만 사용할 수 없다. 당신의 대답과 나의 문제에 대한 더 많은 분석을 읽은 후에 나는 이제는 플렉스를 사용하지 않고 내 자신의 렉서를 쓰고 표준 인터페이스로 바이슨에 연결하는 것이 더 낫다는 결론에 도달했습니다. –

+0

@ 마크 : 당신이 주장하는 경우 정의에 후행 컨텍스트를 사용할 수 있습니다. 결국 정의는 단지 매크로 일뿐입니다. 즉, 플렉스 정보의 유일한 비트는 괄호로 확장을 둘러싸는 것이고, 대답에서 알 수 있듯이 종종 잘못 이해합니다. 따라서 정의에서 후행 컨텍스트를 사용하려면 규칙의 끝에서만 정의를 사용해야하며, 괄호를 직접 삽입해야합니다. 정의 :'FOO_OR_BAR_AT_EOL (foo | bar) $'use :'//. * {FOO_OR_BAR_AT_EOL} {puts ("foo"로 끝나는 주석);}'할 것 같은 모습을 많이하게 될 것입니다 ... – rici

+0

...하지만 그렇게하지는 않을 것입니다. 나는 C에서 매크로를 사용하는 것을 좋아하지 않으며 명백한 이점이있을 때만 Flex에서 정의를 사용합니다. 그러나 각자 자신에게. 거친 가장자리에도 불구하고 나는 개인적으로 플렉스가 엄청난 시간 절약이라고 믿는다. YMMV. 프로젝트에 행운을 빈다. – rici