문제

위키피디아의 보간 정의 나는 그냥 학습 flex/에 들어서 쓰고 내 자신의 쉘습니다.내가 알아내려 할 수있는 좋은 방법은 변수 interpolation.처음 접근 방식이 있는 코드를 스캔을 위해 뭔가~내 홈 디렉토리나$myVar,그리고 다음 설정하이 무엇 yyval.stringto 무엇을 사용하여 반환 모습까지 기능이다.나의 문제는 이 도움이되지 않는 때에 나를 텍스트가 나타납니다 하나의 토큰:

kbsh:/home/kbrandt% echo ~
/home/kbrandt
kbsh:/home/kbrandt% echo ~/foo
/home/kbrandt /foo
kbsh:/home/kbrandt%

Lex 정의한 변수:

\$[a-zA-Z/0-9_]+    {
    yylval.string=return_value(&variables, (yytext + sizeof(char)));;
    return(WORD);
}

다음에 내 문법,난 것을 다음과 같:

chdir_command:
    CD WORD { change_dir($2); }
    ;

누구나 알고 있를 취급하는 좋은 방법은 이런 종류의 것은?나는 이에 대한 모든 잘못입니까?

도움이 되었습니까?

해결책

방법은'기존'껍질을 다루는 것과 같은 변수를 대체하기 어려운 처리 lex/yacc.그들은 무엇이 더 좋아하는 매크로 확장을 확장한 후에는 변수,그들은 다시 토큰 입력하지 않고,더 많이 확장하는 변수입니다.그래서 예를 들어,다음과 같이 입력"xx${$foo}"여기서'foo'으로 정의'바'와'바'으로 정의된'$y'로 확장됩니다'xx$y'는 것으로 처리 단어(및$y 지 확장될).

처리할 수 있습니다 이에 코드,하지만 당신은 필요가 많은 지원하는 코드입니다.당신을 사용할 필요가 코드의 yy_buffer_state 물건을 가끔 리다이렉으로 출력 버퍼를 다시 검사에 사용하고,시작국 신중하게 제어할 변수 및 확장할 수 없습니.

가장 쉽게 사용하기 매우 간단한 테스트 결과를 반환하는 토큰 같은 알파(하나 이상의 알파벳 문자),숫자(하나 이상의 자리 숫자),또는 공백(하나 이상의 공간이나 탭),그리고 파서 조립하고 적절하게,그리고 당신은 결국 같은 규칙:

simple_command: wordlist NEWLINE ;

wordlist: word | wordlist WHITESPACE word ;

word: word_frag
    | word word_frag { $$ = concat_string($1, $2); }
;

word_frag: single_quote_string
         | double_quote_string
         | variable
         | ALPHA
         | NUMERIC
        ...more options...
;

variable: '$' name { $$ = lookup($2); }
        | '$' '{' word '}' { $$ = lookup($3); }
        | '$' '{' word ':' ....

당신이 볼 수있는,이 복잡하고 매우 빠릅니다.

다른 팁

일반적으로 괜찮아 보입니다


나는 무엇을 잘 모른다 return_value 잘하고 있습니다 strdup(3) 변수 이름이기 때문에 yytext 단지 버퍼입니다.

Lex와 Parse 사이의 노동 분할에 대해 묻는 경우, 매크로 처리 및 매개 변수 대체를 스캐너로 밀고 문법을 다루는 것이 완벽하게 합리적이라고 확신합니다. WORDS, 목록, 명령, 파이프 라인, 리디렉션 등. 결국, 스타일이없고 운동의 요점을 물리 치는 것은 코드로 모든 것을 수행하는 것이 합리적 일 것입니다.

나는 그렇게 생각합니다 cd 또는 chdir 말단 기호와 문법 생산에서이를 사용하는 것은 최고의 디자인 결정이 아닙니다. 명령이 내장되어 있다고해서 규칙적으로 나타나야한다는 의미는 아닙니다. 계속해서 구문 분석하십시오 cd 그리고 chdir 다른 명령과 마찬가지로. 제작이 아닌 내장 시맨틱을 조치로 확인하십시오.

결국, 쉘 프로 시저로 재정의 된 경우 어떻게해야합니까?

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