2009-11-22 44 views
5

Tôi cần sử dụng flex và bison để phân tích cú pháp một số mã.bison YYSTYPE: Cố gắng sử dụng char *

Loại mặc định của YYSTYPE là int, mặc dù tôi chưa bao giờ khai báo theo cách đó. Đó có phải là mặc định từ bò rừng không?

Nó sẽ giúp tôi rất nhiều để vượt qua chuỗi trở lại. Tôi đọc điều này: How to solve Bison warning "... has no declared type" Điều này trông giống như một cách tiếp cận tốt. (Tôi không cần đầy đủ sức mạnh của một công đoàn, chỉ là phần * char, nhưng tôi cũng có thể sử dụng công đoàn vì nó có thể hữu ích sau này.)

Nó không làm việc cho tôi. Tôi nhận được các lỗi này:

y:111.37-38: $1 of `ConstExpression' has no declared type 
y:113.34-35: $1 of `ConstFactor' has no declared type 
y:114.35-36: $1 of `ConstFactor' has no declared type 
y:119.34-35: $1 of `Type' has no declared type 
y:109.23-48: warning: type clash on default action: <str> != <> 
y:115.23-27: warning: type clash on default action: <str> != <> 
[...more of the same snipped...] 

Sau đây là các tờ khai từ file y ngữ pháp của tôi:

%union { 
    char *str; 
} 

%type<str> ConstExpression ConstFactor Type 

Dưới đây là một dòng từ tập tin .l tôi:

[a-zA-Z]+[a-zA-Z0-9]* { yylval.str = strdup(yytext); return yident;} 

gì khác tôi cần phải làm gì để giải quyết lỗi?

+1

bạn có suy nghĩ nghiêm túc mọi người có thể gỡ lỗi tập tin ngữ pháp của bạn mà không nhìn thấy nó ? –

+6

@Kinopiko, bạn đã nghiêm túc chỉ downvote này bởi vì ông không chỉ dán toàn bộ bài tập về nhà của mình trong và nói "Show me teh codez"? Nó sẽ giết chết bạn chỉ cần nói "Tôi cần thêm thông tin, xin vui lòng gửi toàn bộ tập tin ngữ pháp" hoặc một số như vậy? – steveha

+1

@Kinopiko, khi anh ấy đăng thông tin bạn đã yêu cầu, bạn có hoàn tác ý kiến ​​của mình không? Điều đó dường như rất khắc nghiệt. – steveha

Trả lời

6

Thực ra, tôi chắc rằng tôi biết điều gì sai khi không nhìn thấy ngữ pháp.

Cũng cần phải khai báo các loại ký hiệu đầu cuối, vì chúng có thể và thường trả về giá trị ngữ nghĩa. Hãy suy nghĩ về những thứ như IDNUMBER, có dữ liệu yyval. Nhưng yacc không có bất kỳ cách nào để biết liệu đó chỉ là một số 'x' hoặc một cái gì đó khác và hành động mặc định trong quy tắc là: $$ = $1

Ví dụ: ngữ pháp sau đây làm cho nó thông qua yacc, nhưng hãy thử xóa một nhiều hơn trong những biểu tượng từ %type dưới đây:

%union { 
    char *s; 
} 

%type <s> r1 r2 'x' 

%% 

r1: r2; 

r2: 'x' { printf("%s\n", $1); }; 
3

có lẽ bạn chỉ cần xác định các loại cho thẻ của bạn trong file yacc

%token<str> yident 
+0

Tôi nghĩ rằng điều này là đúng - Nếu bạn trả về một char * trong tập tin lex, bạn không sử dụng% type, mà là cho bison các loại ... – alternative

Các vấn đề liên quan