실제 응용 프로그램에서 어휘 분석기/파서를 효과적으로 사용해 본 적이 있습니까?[닫은]

StackOverflow https://stackoverflow.com/questions/645468

문제

최근에는 ANTLR을 배우기 시작했습니다.나는 어휘 분석기/파서를 함께 사용하여 프로그래밍 언어를 구성할 수 있다는 것을 알고 있습니다.

DSL이나 프로그래밍 언어 외에 실제 문제를 해결하기 위해 어휘분석기/파서 도구(및 지식)를 직간접적으로 사용한 적이 있습니까?일반 프로그래머가 어휘분석기나 파서에 대한 지식 없이 이러한 문제를 해결하는 것이 가능합니까?

도움이 되었습니까?

해결책

예, 나는 그들을 사용했습니다. 그렇습니다. 당신은 그들과 함께 일을 할 수 있습니다. 그러나 당신이 일을 위해 잘못된 도구를 선택할 때마다, 당신은 자신에게 불필요하게 고통을 줄 것입니다.

비표준 사용의 일부 예는 개인적으로 기술을 다음과 같습니다.

  • 레거시 시스템에 의해 생성 된 보고서에서 데이터를 긁어냅니다
  • Regexp에 너무 복잡한 데이터의 패턴 선택
  • 프로토콜 분석
  • 텍스트 기반 모험 게임
  • 톨레도를 먹은 메타 프로 그라밍 API (실제 이름이 아님)
  • 코드 분석 / 로그 분석
  • 데이터베이스에서 "freeform"필드를 선택합니다
  • 그리고 scads 더 많은 나는 "m 잊어 버린다 (나는 늙었다)

다른 팁

구문 강조 표시. 그만큼 스카이트 텍스트 편집기를 사용하면 자신의 Lexer (C ++)를 작성하여 모든 사용자 정의 언어에 대한 구문 강조 표시를 제공 할 수 있습니다. 나는이 주제에 대한 리프레셔로 Scite에 대한 내 자신의 커스텀 Lexer를 썼습니다 (나는 얼마 전에 대학에서 공부했습니다).

정규 표현식은 종종 패턴 매칭 및 간단한 언어 처리를위한 대안으로 사용됩니다. .NET와 같은 프레임 워크의 개선 된 REGEX 지원 덕분에 최근 몇 년 동안 더 일반적입니다. 대부분의 경우 개발자는 Lexing/Parsing 기술을 알지 못할 수도 있으므로 기본적으로 USNG Regex에 속합니다.

그러나 또 다른 대답이 말했듯이, Regex는 간단한 문법/언어 이상의 것을 신속하게 비효율적이며 느리고 유지하기가 어려워 질 수 있습니다. 이러한 상황에서 Parser/Lexers가 일반적으로 최선의 선택입니다.

예, 저는 실제 물건에 사용했지만 대부분 렉서와 파서를 사용하는 맞춤형 언어를 만들어 XML에 정의 된 언어에 의해 대체되었습니다. 더 장점이지만 그 모든 일을 할 필요는 없습니다 ...

예, 나는 그들을 사용했습니다. 나는 Antlr의 열렬한 팬입니다. Antlr 사용에 대한 몇 가지 팁과 요령을 제공합니다 여기 그리고 그것의 간단한 보증 여기. 임시 방법을 사용하여 자신의 파서를 손으로 쓸 수는 있지만, 파서가 구문 분석 해야하는 언어를 키우는 데 필요한 경우 변경하는 방법을 알아내는 데 훨씬 더 어려워 질 것입니다.

텍스트 입력을 처리하는 모든 장소는 어떤 종류의 Lexer/Parser를 사용하여 끝납니다. 때로는 퇴화 케이스가되지만 (Lex는 하나의 토큰 유형으로 쉼표를 제외하고 다른 쉼표를 다른 쉼표로 말합니다. 숫자, 이름, 숫자를 구문 분석합니다. 그리고 선의 끝. 그런 종류의 것) 한 가지 방법으로 그것을보고 sscanf Lexer/Parser Generator의 가장 퇴화 된 사례로 간주 될 수 있습니다.

완전히 날아간 LEX/YACC 운영에 관해서는? 나는 그것이 주로 사용되기를 기대합니다 GPLS 그리고 DSL의 느슨한 정의에 속하는 것들을 위해

정적 문서 (예 : 파일) 또는 동적 문서 (예 : 시간이 지남에 따라 발생하는 스트림)가있을 때마다, 해당 문서에는 어떤 종류의 구조가 있으므로, 어떤 종류의 파서가 필요하다는 것을 알 수 있습니다. 단순한 구조물의 경우 임시 구문 분석 (문자열 해킹, Regexes 등)을 사용할 수 있습니다. 둥지가 아닌 구조의 경우 유한 상태 기계로 얻을 수 있습니다. 여기서 Lexer 생성기가 종종 도움이됩니다. 복잡한 구조의 경우, 당신은 거의 조직화 된 파서입니다. 재귀 적 출신 스타일 구문 분석에 익숙하다면 파서를 손으로 쓸 수 있습니다. 정말 복잡한 구조의 경우, 파서 생성기는 거의 항상 큰 승리입니다.

컴퓨터 langauge를 처리하려면 Lexers와 Parsers를 시작 장소로 거의 필요로합니다. 그들은 충분하지 않습니다. 파서 결과로 무언가를해야합니다.

우리가 한 렉싱과 구문 분석의 정말 멋진 사용은 1960 년대 언어 인 Jovial을 B-2 스텔스 폭격기를 위해 C로 번역하는 것입니다. 보다 http://www.semdesigns.com/products/services/northropgrummanb2.html

많은 시스템에서 사용중인 Lexer/Parser의 훌륭한 예는 Apache Lucene (오픈 소스 검색 색인 라이브러리)에 존재합니다. 쿼리 파서와 문서 토큰 화제는이 기술을 사용합니다. Lucene의 쿼리 파서를 DSL 파서로 분류 할 수 있다고 생각하지만 여전히 실제 문제를 해결하는 데 사용되고 있습니다.

그 문제에 대해 Google은 자체 쿼리 구문 및 문서 구문 분석을 위해 일종의 Lexer/Parser를 사용하고 있다고 확신합니다.

이건 재미 있네 -

IBindingListView 구현에서 간단한 문자열 기반 쿼리 표현식을 처리할 수 있도록 어휘분석기/파서를 직접 작성했습니다.그것은 코드 외부에서 제가 실제로 사용할 수 있었던 첫 번째 유용한 것이었고, 단지 그것에 대해 들어본 것은 아닙니다.

꽤 보행자의 예이지만, 나는 그들에 대한 경험상 꽤 보행자입니다.

나는 큰 사람들 중 하나를 사용하여 어휘 분석을 수행하지 않았지만, 내가 작업 한 프로젝트를 위해 내 자신의 Lexer를 손으로 썼습니다. 우리는 가까운 우주 프로젝트의 데이터 컴퓨터에서 돌아온 데이터를 구문 분석해야했으며 바이너리의 SD 카드에 기록되었습니다. 비트를 뽑아서 이진에서 소수점으로 변환 한 다음 전체 내용을 쉼표로 분리 된 파일로 작성해야했습니다.

앉아서 논리적으로 생각하고 당면한 과제를위한 상태 기계를 작성하는 것은 많은 재미입니다!

예! 내가 협력하는 팀은 문서 생성 프레임 워크를 구현했으며, 무엇보다도 (대부분 산술) 표현식을 평가할 수 있습니다. 우리는 구문 분석기를 사용하여 생성 된 문서의 입력/정의에서 표현식을 추출하고 표현 트리를 만듭니다. 그 후 그 나무는 평가되고 평가 된 결과는 최종 문서에 기록됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top