정규 표현식이없는 어휘 분석


9

다양한 고급 언어 ( Python , PHP , Javascript 등) 의 몇 가지 어휘 분석기를 살펴 보았으며 모두 정규식을 한 형태 또는 다른 형태로 사용하는 것 같습니다. 정규식이 아마도 이것을 수행하는 가장 좋은 방법이라고 확신하지만 정규 표현식없이 기본적인 어휘를 얻을 수있는 방법이 있는지 궁금합니다.

예, 어떤 형태의 정규 표현식을 사용하지 않고도 더 높은 수준의 언어로 일종의 기본 어휘를 구현할 수 있습니까?

* Perl / PHP / Python / Javascript 등과 같은 고급 언어는 C 언어로 할 수있는 방법이 있다고 확신합니다.


2
"그리스어 문자와 이상한 구불 구불 한 것들을 모두 사용하지 않는 미적분학에 관한 책이 있습니까?"
케빈 클라인

@kevincline 왜 하늘에 완벽하게 좋은 비행기가있을 때 사람들이 대서양을 건너는가?
Smudge

1
로잉과 라이딩에는 다른 부작용이 있습니다.
kevin cline

답변:


3

우선, "고급"언어가 발명되기 전부터 C에 대한 정규식 라이브러리가있었습니다. C 프로그램은 일부 사람들이 생각하는 것처럼 펑크하지 않습니다.

대부분의 문법에서 렉싱은 공백과 () [] {}; 단어를 분리 한 다음 키워드 목록과 비교하여 일치하는지 확인하십시오.


1
나는 C가 정규 표현식을 수행 할 수 없다는 것을 의미하지는 않았다. 고급 언어보다 C에서 고급 고성능 렉서를 만드는 것이 더 쉽다고 생각합니다.
Smudge

1
@sam 어휘 분석기 나 파서의 복잡성과 성능은 파서가 구현 된 언어보다 구문 분석되는 언어의 복잡성의 기능에 가깝다.
jk.

+1. 어휘 분석기는 매우 간단합니다. 문자열, 토큰의 데이터 유형 및 사전 정의 된 키워드 테이블이 필요합니다. 가장 까다로운 부분은 공백과 주석에 대해 다루고 있습니다 : P
메이슨 윌러

2

별도의 토큰 화 단계가없는 "스캐너없는 파서"에 관심이있을 수 있습니다. 이 문서의 시작 부분에는 스캐너없는 파서의 이점에 대한 한 가지 설명이 나와 있습니다. 스캐너없는 일반화 된 LR 파서를위한 명확성 필터 . (하지만 단점도 있습니다.)

(다른 답변에서 언급 된 PEG는 스캐너없는 파서를 구성하는 데에도 사용될 수 있습니다.)


1

정규 표현식에 대한 구체적인 내용은 없습니다. 코드는 훨씬 짧기 때문에 코드를 훨씬 쉽게 생성 할 수 있으며 구현은 일반적으로 제공됩니다. 그러나 기본적으로 어휘 분석기는 FSM이며 정규 표현식은 이러한 목표를 달성하는 한 가지 방법 일뿐입니다.


0

물론 모든 일반 언어에는 컨텍스트가 없으므로 다른 파서를 사용할 수 있습니다. 질문은 왜 당신이 원하는지에 달려 있습니다.

정규 표현식보다 더 간단한 것은 없습니다 (O (N)을 어떻게 향상시킬 수 있습니까?). 단순화하려고해도 도움이되지 않습니다. Jetti가 지적했듯이 항상 간단한 역 추적을 사용할 수 있지만 가능하면 피하는 것이 좋습니다.

lexing에 고급 파서를 사용하려면 lexing 단계가 전혀 필요하지 않습니다. 사실, 우리가 어휘 단계를 갖는 이유는 문자를 구문 분석하는 것보다 어휘 토큰을 구문 분석하는 것이 구문 분석 단계를 크게 단순화하는 것보다 빠르기 때문입니다. 따라서 고급 파서를 사용하면 처음에는 렉싱의 모든 이점을 잃게됩니다.


그렇다면 정규 표현식은 어떻게합니까? 여전히 문자별로 가야하지 않습니까 (적어도 렉싱에 사용되는 대부분의 패턴에 대해)?
Jetti

물론 @Jetti.
Pubby

각 문자를 읽고 토큰을 꺼내기 위해 필요한 경우 역 추적하는 것이 쉽습니다. 더 많은 코드이지만 더 어렵지는 않습니다.
Jetti

@Jetti 나는 순진한 역 추적이 어떻게 더 나은지 보지 못했습니다.
Pubby

나는 더 나은 말을 한 적이 없습니다. 그러나 OP는 다른 방법이 있는지 물었고 고급 파서가 아닌 다른 방법입니다.
Jetti

0

정규 표현식으로 어휘 분석을 수행하거나이 패스를 전혀 건너 뛰고 PEG 또는 GLR을 사용하여 훨씬 유연하고 강력한 어휘 분석을 수행하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.