2014-11-27 2 views
-1

yacc과 lex로 작업하고 있는데 문제가 있습니다.yacc와 lex char 배열로 계산기 만들기

나는 caluclator에서 작업하고 있습니다. 내 계산기를 사용하면이 작업을 수행 할 수 있습니다

예 : 문제

user: a = 1+3 
user: a 
calc: 4 

, 난 단 하나 개의 문자와 함께 할 수 있습니다. 하지만 최대 3 자까지 입력하고 싶습니다.

예 :

user: abc = 1+3 
user: abc 
calc: 4 

또한 좀 더 뭔가를 추가 할.

내 코드는 다음과도 작동합니다 : 내 문제와 연결 내 코드의

user: abc = 1+3 
user: abc 
calc: 4 
user: ab 
calc: 4  /* THIS IS BECAUSE IT SCAN ONLY FIRST CHARACTER */ 
user: a 
calc: 4  /* THIS IS BECAUSE IT SCAN ONLY FIRST CHARACTER */ 

부 :

-YACC

%{ 

int symbolVal(char symbol); 
void updateSymbolVal(char symbol, int val); 

%} 

%union {double num; char id;} 
%token <id> identifier 
%type <id> assignment 

%% 

assignment : identifier EQUALS exp { updateSymbolVal($1, $3); } 

term : /*something */ 
     | identifier { $$ = symbolVal($1); } 

%% 

/* C CODE */ 

int symbolVal(char symbol) { 
    int bucker = computeSymbolIndex(symbol); 
    return symbols[bucket]; 
} 

void updateSymbolVal(char symbol,int val) { 
    int bucket = computeSymbolIndex(symbol); 
    symbols[bucket] = val; 
} 

int computeSymbolIndex(char token) { 
    int idx = 0; 
    idx = token - 'a' + 26; 
    return idx; 
} 

내가 그 코드 가 말하고 싶은을 수정하십시오.

하지만이 모든 것이 최대 3 자까지만 필요합니다.

어쩌면이 배열이나 포인터를 할 수 있지만 어떻게 모르겠다.

+0

. 더 기능적인 버전을 시도하고 프로그램이 멈췄을 때 돌아 오십시오. –

+0

@ Micheled'Amico 답변을 많이 주셔서 감사합니다, 나는 배열을 사용해야하지만, 어떻게 알지는 못한다 :/ – Nebojsa

+0

이것은 C와 관련이 있습니다 ? – dhein

답변

0

내 생각 엔 Lex에서는 하나의 문자를 토큰으로 반환한다는 것입니다. 이를 수행하는 방법은 변수를 나타내는 토큰을 반환하고 실제 이름을 yyval로 반환하는 것입니다. 다음은 lex 파일을 보지 않고 더 이상 당신을 도울 수는 없지만 코드가 작동하도록 만드는 코드 스 니펫입니다.

LEX :

[a-zA-Z]+ { yylval.s = new std::string(yytext); return tVARIABLE; } 

YACC : 당신은 문자열과 배열을 사용해야하지만, 당신을 도우려고 너무 애매

%union { 
    str s; /* symbol name */ 
} 
%token<s> tVARIABLE 

... 

// on the grammar: 
identifier: tVARIABLE { $$ = $1; } 
+0

답변을 주셔서 감사합니다.이 경우 내 렉스는 [a-z] {1,3} {yylval.id = yytext [0]; 반환 식별자; } 코드로 무엇을하고 싶은지를 이해하지만, 문자열 정수 값을 넣어야하고, 내 질문에 함수를 사용하고 있습니다. 그러나 문자열을 넣을 때, 문자로 문자를 가져 오는 법. 너는 나를 undrestand합니까? – Nebojsa

+1

두 경우 모두 값을 수동으로 삭제/해제해야하기 때문에 간단한'C' strdup (yytext)보다'new std :: string (yytext)'를 사용하면 거의 또는 전혀 이점이 없습니다. 그러나 서면으로, 노동 조합 선언은'% union {std :: string * s; }' – rici

+0

'union {double number; char [4] id; }'? 아무것도 새로 만들거나 삭제할 필요가 없습니다. –