2013-07-01 4 views
3

컴퓨터 언어를 구문 분석하기위한 문법을 ​​작성 중이며 Parse::Eyapp과 함께 사용할 수 있습니다. 이것은 정규 언어에 대한 파서 작성을 단순화하는 Perl 패키지입니다. yacc 및 다른 LALR 파서 생성기와 비슷하지만 정규식과 관련하여 토큰을 정의하는 것과 같은 유용한 확장 기능이 있습니다.대소 문자를 구분하지 않는 키워드 검색

구문 분석하려는 언어는 섹션을 나타 내기 위해 키워드를 사용하고 제어 흐름을 설명합니다. 또한 데이터의 자리 표시 자 역할을하는 식별자를 지원합니다. 식별자는 키워드와 같은 이름을 가질 수 없습니다.

여기에 까다로운 부분이 있습니다. 키워드와 식별자를 구분해야하지만 유사 할 수 있으므로 식별자와 대소 문자를 구분하지 않는 정규 표현식 패턴이 필요합니다.

내가 생각 해낸 해결책은 다음과 같다 :

  1. 각 키워드는 다음과 같은 형식의 토큰에 의해 식별됩니다 /((?i)keyword)(?!\w)/
    • (?i) 다음과 같은 서브 패턴
    • 에 대한 대소 문자 구분 일치를 적용합니다
    • (?!\w)
    • 문자 뒤에 오는 단어 (az, 0-9 등)를 수락하지 않습니다.
  2. 다른 키워드의 시작은 더 이상 키워드 다음에 나열되어과 동일 키워드, 그래서 그들은 첫 경기
  3. 단지 어떤 키워드가 인식되지 않을 때 일치하므로 일치하는 식별자에 대한 토큰이 마지막으로 오는

내가 정의한 토큰 정의와 문법의 일부는 지금까지 잘 작동했지만 여전히해야 할 일이 많이 있습니다. 그러나 그것은 내 질문이 아닙니다.

제가 물어보고 싶은 것은입니다. 나는 올바른 길을 가고 있습니다. 그 키워드를 매칭하는 데 더 나은, 더 간단한 정규 표현식이 있습니까? 언어 구문 분석을 중단하고 다른 방식을 사용해야합니까?

토크 나이저를 사용하여 단일 문자 대신 전체 문자열을 일치시키려는 아이디어는 Parse :: Eyapp 설명서에서 제공되었습니다. 먼저 문자 대 문법으로 시작했지만 그 방법은 그리 우아하지 않고 파서 생성기의 유연한 특성과 모순되는 것으로 보입니다. 글쓰기가 너무 번거 롭습니다.

+0

이 코드는 [codereview.se] (http://codereview.stackexchange.com/)에 속한 것 같습니다. –

+0

아마도 코드 검토를 요청하지 않을 것입니다. 차라리 프로그래밍 언어의 좋은 토크 나이저 (tokenizer) 및 어쩌면 문법을 개발하는 데 대한 힌트를 얻고 싶습니다. 나는 그것을 더 명확하게해야한다고 생각합니다. – onitake

+0

제대로 된 것 같습니다. lex/flex를 사용하면 비슷한 패턴의 키워드를 만들 수 있습니다. 주요한 일은 귀하의 키워드 (귀하가하고있는) 주위에 "단어 경계"를 표시하고 일반 식별자 앞에 모든 키워드 토큰을 일치시키는 것입니다. –

답변

2

언어를 구문 분석하려면 Marpa이 더 적합 할 수 있습니다. 여기에 tutorial이 있습니다. regexp grammars을 사용할 수도 있습니다.

+0

와우, 둘 다 매우 강력 해 보입니다.나는 yacc/yapp로 손을 더러 뜨리는 데 며칠을 보냈지 만 전환하기에는 너무 늦지 않았습니다. – onitake

+0

Marpa는 사용법이 훨씬 쉬워지고 더 강력 해졌습니다. 최신 튜토리얼은 http://marpa-guide.github.io/index.html, http://marpa-guide.github.io/index.html 및 http://marpa-guide.github.io/입니다. index.html. –

+0

지금까지'Regexp :: Grammars'를 시도했습니다. 그 구문은'Parse :: Eyapp'보다 더 다재다능하고 기본적으로 Perl의 정규식을 향상시키는 것을 좋아합니다. 불행히도, 나는 [큰 쇼스타] (https://rt.cpan.org/Public/Bug/Display.html?id=79149)를 쳤다. 그럼 Marpa를 보자. – onitake

관련 문제