2012-02-29 2 views
2

코드에서 RPAREN을 찾는 가장 좋은 방법은 무엇입니까? 내가 처음 LPAREN을 고려한다면, 그것은 마지막 RPAREN (케이스 B)와 일치 할 필요, 예를 들어RPAREN을 올바르게 찾으십시오 (빠른 구문 분석을 가능하게하기 위해)

if(a && (b || "c)")) 
    |  ^---------^| CASE A 
    ^----------------^ CASE B 

: 예를 들어 , 나는이 의사 코드가 있습니다. 두 번째 LPAREN을 고려해 보면 마지막 1 RPAREN (사례 A)과 일치해야합니다.

RPAREN이있는 "C)" 문자열이 있지만이 경우에는 무시해야합니다.

음 ... 나는 정규식에 대해 생각하지만 매우 복잡 할 것이라고 생각한다. (문자열, 정규식이 필요하고 정규식이 필요하고 RPAREN 등을 포함 할 수 있다고 생각한다.) 그렇다면 수동 조사 (코드를 통해)를 사용하여 각 부분을 검색하는 방법을 생각해 봅니다 (수동 정규식과 같습니다).

내가 만들고있는 코드 (자체 프로그래밍 언어)를 구문 분석하려면이 코드가 필요합니다. 그리고 나는 더 빨리 그것을 만들기 위해 몇 가지 코드를 읽으려고 무시하고 싶다. 예를 들어

: a()가 사용되지 않기 때문에이 경우에

function a() { return 1; } 
function b() { return 2; } 
alert(b()); 

b()는 구문 분석 할 필요가있다. 따라서 나는 시동기 {에 의하여 검사하고 진짜 }까지 (그러나 저장) 묵살 할 것이다. 함수가 사용되면 파싱됩니다.

내 의심 :

  1. 정규식 또는 수동 코드?
  2. 좋은 일이나 나쁜 일은 무엇입니까? 코드를 사용하지 않으면 코드를 무시하면 파서의 속도가 향상됩니다.
  3. 오프 주제 : 파서를 빠르게 수행 할 수있는 팁이 있습니까? 어쩌면 컴퓨터 코드 (opcode ???)로 언어 코드를 저장하는 "미리 파싱 된"파일일까요?
+1

중첩 된 구조를 정규식으로 구문 분석 할 수 없습니다. 어휘 분석기와 구문 분석기를 사용하십시오. – leppie

답변

2

자신의 언어를 작성하는 경우 언어 소스 코드를 처리하는 표준 방법에 대해 실제로 배워야합니다. (영리한 새로운 아이디어를 제안하는 것은 환영 할만한 일이지만, 대부분의 아이디어는 그렇게 똑똑하지 않은 것으로 판명되며, 표준 아이디어를 아는 경우에는 종종 그 이유에 대해 꽤 분명합니다.

코드를 실제로 처리 할 수 ​​없으며 괄호를 순수 정규 표현식과 "일치"시킬 수 없습니다. 중첩 된 괄호 (또는 중괄호, IF 및 ENDIF ...와 같은 일치 할 수있는 항목)와 일치하도록 일종의 푸시 다운 자동 또는 카운팅 엔진이 필요합니다. 이러한 작업의 맥락에서 종종 "파서"라고합니다.

1) 정규식 또는 수동 코드 : 귀하의 세 질문에 대해서는

?

예를 들어 ANTLR과 같이 파서 생성기에 대해 자세히 알아 보거나 사용하십시오.

2) 좋은 일입니까 나쁜 일입니까? 코드를 사용하지 않으면 코드를 무시하면 파서의 속도가 향상됩니다.

이것은 실제로 "조기"최적화입니다. 간단히 구문 분석 엔진을 사용하는 것이 좋습니다. ANTLR은 꽤 좋습니다. 나는 그 차이를 눈치 챘을 지 의심 스럽다. 당신이 타오르는 빠른 것을 주장하는 경우에, LRSTAR를 대신 고려하십시오; 이를 구축 한 사람은 생성 된 파서를 마이크로 최적화하는 데 지난 10 년간을 소비했습니다.

프로그래밍 랭귀지를 구현하려고한다는 점을 감안할 때 실질적으로 구문을 정의하고 파서를 만들고 실용적인 방법으로 실행하는 데 어려움을 겪는 것에 대해 걱정할 것을 제안합니다. 해석 또는 컴파일이 중요하지 않음을 의미). 구문 분석 비즈니스를 이해하는 귀하의 apparant 수준을 감안할 때, 나는 당신이 정말로 이것을 할 준비가되지 않은 것으로 의심합니다. 컴파일러가 일반적으로 작동하는 방법을 배우는 데 약간의 시간을 투자하는 것이 좋습니다. 따라서 참조 점이 있습니다.

3) 오프 주제 : 파서를 빠르게 할 수있는 몇 가지 팁이 있습니까? 어쩌면 컴퓨터 코드 (opcode ???)로 언어 코드를 저장하는 "미리 파싱 된"파일일까요?

텍스트를 전처리하고 토큰 집합으로 저장하여 파서의 처리 속도를 높일 수 있습니다. 이전 구문 분석의 결과를 변경하지 않은 가정하에 저장하여 속도를 향상시킬 수도 있습니다 (큰 코드 시스템의 대부분의 소스 파일은 많이 다시 컴파일 될 수는 있지만 변경되지 않습니다). 컴파일 된 코드를 소스 텍스트와 함께 일부 표현으로 저장하여 컴파일하지 않아도됩니다. [나는 이와 같은 개별 함수를위한 컴파일 된 코드를 저장하는 것을 고려했다. 파일을 편집하더라도 대부분의 기능은 변경되지 않습니다.] 이러한 트릭에는 모두 문제가 있습니다.이 모든 것을 설정하여 프로그래머와 편집자를 어떻게 협력하게합니까? 빨리 파서를 만드는 것이 훨씬 쉽습니다. 그리고 거기서 시작해야하고 나중에 멋진 속임수에 대해 걱정해야합니다.

3
  1. 정규식은 괄호 일치하지 않을 수 있습니다 - 그것은 불가능합니다. 이런 식으로 언어를 파싱하는 한 가지 방법은 lex (토큰 화)와 yacc (파서)입니다. 그물에 관한 많은 정보를 찾을 수 있습니다.

  2. 파서에 최적화를 추가하면 구문 분석 속도가 향상되지 않지만 결과 코드의 성능이 향상 될 수 있습니다. 좋고 나쁜 것은 도덕적 판단이고, 나는 그들이 여기서 무엇을 의미하는지 알지 못합니다.

  3. 소스의 패턴을 일치시키고 미리 컴파일되고 최적화 된 코드를 대체하면 개선 된 결과를 얻을 수 있지만 구문 분석 속도가 향상되는지 여부는 코드에 패턴이 나타나는 빈도에 따라 다릅니다.

+0

예 ... 저는 그것에 대해 생각합니다 (그것은 수동 코드 방법입니다). 하지만 질문 2와 3에 대해서? 대답 해 줄래? :) –

관련 문제