문제

오랫동안 궁금한 점이 궁금했습니다. BNF, 그것은 다양한 라이브러리에서 regexps처럼 행동합니다.

물론, 같은 것들이 있습니다 antlr, YACC 그리고 다른 많은 사람들 코드를 생성합니다 결국, 구문 분석 할 수 있습니다 CFG, 그러나 중간 단계 없이는 그렇게 할 수있는 라이브러리가없는 것 같습니다.

글을 쓰는 데 관심이 있습니다 Packrat Parser, regexps와 관련된 모든 중첩-파열-쿼크를 부팅하기 위해 (그리고 아마도 그 스포츠를 위해), 어쨌든 나는 다른 맹렬한 문제와 같은 다른 늪지대에 걸어 다니고 있다는 느낌을 가지고 있습니다.

이 파서에 대한 기술적/이론적 제한이 있습니까, 아니면 내가 뭔가 빠진 것입니까?

도움이 되었습니까?

해결책

나는 그것이 문화적 일이라고 생각합니다. 상황이없는 문법의 사용은 대부분 컴파일러에 국한되며, 일반적으로 각 생산 규칙과 관련된 코드가 있습니다. 일부 언어에서는 콜백을 시뮬레이션하는 것보다 코드를 출력하는 것이 더 쉽습니다. 다른 경우에는 Parser Libraries : Haskell의 Parser Combinator가 표시됩니다. 반면에 일반 표현식은 GREP와 같은 도구에 광범위한 사용을보고 있는데, 여기서 사용자가 새로운 정규 표현식을 제공 할 때마다 C 컴파일러를 실행하는 것이 불편합니다.

다른 팁

boost.spirit 당신이 뒤에있는 것 같아요.

당신이 당신의 자신을 만들려고한다면, 나는 BNFC 최신 컴파일러 프로젝트를 위해 제공합니다 자체 구현에 사용 된 문법. 이것은 좋은 출발점 일 수 있습니다 ...

그림자에 기술/이론적 제한이 숨겨져 있지 않습니다. 나는 그들이 왜 더 인기가 없는지 말할 수 없지만, 당신이 찾는 이런 종류의 "온라인"구문 분석을 제공하는 적어도 하나의 라이브러리를 알고 있습니다.

단순한 털이 많은 EBNF 문법을 프로그램에 붙여 넣고 itermediate 단계없이 즉시 구문 분석하는 데 사용하는 파이썬 라이브러리입니다. 맞춤 입력 언어를 원했지만 공식적인 빌드 프로세스에 헌신하고 싶지 않은 여러 프로젝트에 사용했습니다.

여기 내 머리 꼭대기에서 작은 예가 있습니다.

decl = r"""
    root := expr
    expr := term, ("|", term)*
    term := factor+
    factor := ("(" expr ")") / [a-z]
"""
parser = Parser(decl) 
success, trees, next = parser.parse("(a(b|def)|c)def")

Haskell 및 Scala 용 Parser Combinator 라이브러리는 또한 사용하는 동일한 코드 덩어리로 구식 문법을 표현할 수 있도록합니다. 그러나 런타임에 문법에 사용자가 문법을 입력 할 수는 없습니다 (어쨌든 사람들이 문법을 이해하도록 돕기 위해 소프트웨어를 만드는 사람들에게만 관심이있을 수 있습니다).

pyparsing (http://pyparsing.wikispaces.com)는 Packrat Parsing에 대한 내장 지원을 제공하며 순수한 Python이므로 실제 구현을 볼 수 있습니다.

완전한 맥락이없는 문법은 비밀 조밀하고 이해할 수없는 구문이 없어서 더 혼란스럽게 만들기 위해 충분히 혼란 스럽기 때문입니까?

당신이 무엇을 요구하는지 알기가 어렵습니다. 정규 표현과 같은 것을 만들려고하지만 상황이없는 문법을 위해 노력하고 있습니까? 사용합니다 $var =~ /expr = expr + expr/ (Perl에서) 그리고 그 일치 "1 + 1" 또는 "1 + 1 + 1" 또는 "1 + 1 + 1 + 1 + 1 + ..."? 나는 이것의 한계 중 하나가 구문이 될 것이라고 생각한다.

부작용은 내가 당신을 얻을 수있는 유일한 것입니다. 대부분의 파서 생성기에는 처리를위한 임베디드 코드가 포함되어 있으며 해당 작업을 수행하려면 평가가 필요합니다.

그 주변의 한 가지 방법은 행동을 지정 한 다음 행동의 이름과 Args가 수행하는 "액션"기능을 만드는 것입니다.

당신은 이론적으로 그것을 할 수 있습니다 정신을 부스트하십시오 C ++에서는 주로 정적 문법을 위해 만들어졌습니다. 이것이 흔하지 않은 이유는 CFG가 Regex만큼 일반적으로 사용되지 않기 때문입니다. 컴파일러 구성을 제외하고 문법을 사용할 필요는 없었지만 Regexs를 여러 번 사용했습니다. CFG는 일반적으로 REGEX보다 훨씬 복잡하므로 YACC 또는 AntlR과 같은 도구로 정적으로 코드를 생성하는 것이 합리적입니다.

tcllib 당신이 참을 수 있다면 그런 것이 있습니다. 표현 문법을 구문 분석합니다 그리고 또한 TCL. Perl이 CPAN이 가진 것입니다 구문 분석 :: Earley. 여기'유망한 것처럼 보이는 순수한 perl 변형. 주름 파이썬에 대한 그럴듯한 솔루션 인 것 같습니다

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