2017-11-07 4 views
3

DCG 인수를 사용하여 토큰/구문 트리 목록을 작성하는 Prolog DCG를 사용하여 간단한 프로그래밍 언어로 렉서/구문 분석기를 구성했습니다.구문 분석중인 문장에서 생성 된 Prolog DCG 인수

symbol(semicolon) --> ";". 
symbol(if) --> "if". 

다음 구문 트리가 DCG 규칙에 그 인수를 사용하여 만들어집니다.

그러나 변수와 숫자 (이 언어의 정수만)를 파싱 할 때 DCG 인수가 더 동적이되어야합니다.

symbol(number(X)) --> X, {integer(N)}. 

본질적으로 실제로 구문 분석하는 것으로부터 본질적으로 생성되는 DCG 인수가 필요합니다. 이것을 할 수있는 방법이 있습니까? 그렇지 않은 경우 좋은 해결 방법은 무엇입니까?

편집 : 구체적인 예로서, 나는 규칙

symbol(num(N)) --> {number_codes(N,C)}, C. 

있어 및 phrase(symbol(num(N)),"7").

+1

확실히 가능합니다. [dcg/basics] (http://www.swi-prolog.org/pldoc/doc/_SWI_/library/dcg/basics.pl)를 보았습니까? (또한, 그것을위한 소스 코드도 [꽤 가르침이다] (http://www.swi-prolog.org/pldoc/doc/_SWI_/library/dcg/basics.pl?show=src#integer/3).) –

+1

네가 가까와. 'number (1) '이 표준 Prolog 술어이기 때문에 당신은 조심하고 싶다. 아마도 다른 것을 골라야 할 것입니다. – lurker

+0

나는 그렇게 확신하지 못한다. 내가 직면 한 구체적인 예는 다음과 같습니다. 'symbol (num (N)) -> {number_codes (N, C)}, C'. 'phrase (symbol (num (N)), "7")을 입력 할 때'N = 7' 출력이 필연적으로 필요합니다. – user2396812

답변

2

를 조회 할 때 나는 여기에 세 가지 문제를 참조 출력 N=7이 필요합니다.

  1. phrase/2은 코드 목록을 조작하려고합니다. 버전 7부터 SWI에는 DCG를 지원하지 않는 네이티브 문자열 유형이 있습니다. 그래서, 당신은 지금이 약간 불편 배합에 의지해야합니다 일반적으로

    atom_codes("if", Codes), phrase(symbol(X), Codes) 
    
  2. 을, 당신은 입력 에서 뭔가를 벗겨하려면 다음 몇 가지 순수 - 프롤로그 술어에 손이 뭔가를 할 수 있습니다. 즉,이 같은 일이 :

    symbol(num(N)) --> [C], { number_codes(N, [C]) }. 
    
    ?- atom_codes(9, X), phrase(symbol(S), X). 
    X = [57], 
    S = num(9). 
    

    이 의지 물론, 단지 아마 당신이 원하는 것이 아닙니다 한 자리 숫자, 작동, 그래서 ...

  3. 당신은 아마해야

    :- use_module(library(dcg/basics)). 
    
    symbol(num(N)) --> integer(N). 
    
    ?- atom_codes(973, X), phrase(symbol(S), X). 
    X = [57, 55, 51], 
    S = num(973). 
    

    을 또는 당신은 the source code를 사용하여 복사/붙여 넣기 일을 할 수있는이 같은 dcg/basics.pl의 코드를 사용합니다. 아마 거기에있는 모든 DCG 규칙은 다른 DCG 규칙에 대한 호출로 시작하거나 입력의 일부를 소비 한 다음 다른 작업을 수행합니다. 당신은 아마도 무언가를 생성하고 그것을 입력에서 찾길 원하지 않을 것입니다.