4.12 assgn_st.cpp

#include<iostream>
struct inflatable
{
    char name[20];
    float voluem;
    double price;
};

int main()
{
    using namespace std;
    inflatable bouquet =
    {
        "sunflowers",
        0.20,
        12.49
    };
    inflatable choice;
    cout << "bouquet: " << bouquet.name << " for $";
    cout << bouquet.price << endl;

    choice = bouquet;
    cout << "choice: " << choice.name << " for $";
    cout << choice.price << endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本问题所需的代码较为复杂,无法在此处全部展示。以下是一个简化版本,供参考: 1. Lex代码: ``` %{ #include <stdio.h> #include <stdlib.h> #include "y.tab.h" %} %% "int" { return INT; } "float" { return FLOAT; } "char" { return CHAR; } "double" { return DOUBLE; } "if" { return IF; } "else" { return ELSE; } "while" { return WHILE; } "for" { return FOR; } "do" { return DO; } "return" { return RETURN; } [0-9]+ { yylval.num = atoi(yytext); return NUM; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return ID; } "==" { return EQ; } "!=" { return NE; } ">=" { return GE; } "<=" { return LE; } ">" { return GT; } "<" { return LT; } "=" { return ASSGN; } "+" { return PLUS; } "-" { return MINUS; } "*" { return MULT; } "/" { return DIV; } "%" { return MOD; } "(" { return LPAREN; } ")" { return RPAREN; } "{" { return LBRACE; } "}" { return RBRACE; } ";" { return SEMICOLON; } "," { return COMMA; } "[" { return LBRACKET; } "]" { return RBRACKET; } "'" { return SQUOTE; } \" { return DQUOTE; } [ \t\n] ; /* ignore white space */ . { printf("Unknown token: %s\n", yytext); } %% int yywrap() { return 1; } ``` 2. Yacc代码: ``` %{ #include <stdio.h> #include <stdlib.h> #include "tree.h" %} %union { int num; char *str; Node *node; } %token <num> NUM %token <str> ID %token INT FLOAT CHAR DOUBLE IF ELSE WHILE FOR DO RETURN %token EQ NE GE LE GT LT ASSGN PLUS MINUS MULT DIV MOD LPAREN RPAREN LBRACE RBRACE SEMICOLON COMMA LBRACKET RBRACKET SQUOTE DQUOTE %type <node> program decl_list decl var_list var stmt_list stmt expr term factor %start program %% program: decl_list { $$ = create_node(PROGRAM, $1, NULL, NULL); } decl_list: /* empty */ { $$ = NULL; } | decl_list decl { $$ = create_node(DECL_LIST, $1, $2, NULL); } decl: type var_list SEMICOLON { $$ = create_node(DECL, $1, $2, NULL); } type: INT { $$ = create_node(TYPE, "int", NULL, NULL); } | FLOAT { $$ = create_node(TYPE, "float", NULL, NULL); } | CHAR { $$ = create_node(TYPE, "char", NULL, NULL); } | DOUBLE { $$ = create_node(TYPE, "double", NULL, NULL); } var_list: var { $$ = create_node(VAR_LIST, $1, NULL, NULL); } | var_list COMMA var { $$ = create_node(VAR_LIST, $1, $3, NULL); } var: ID { $$ = create_node(VAR, $1, NULL, NULL); } | ID LBRACKET NUM RBRACKET { $$ = create_node(VAR, $1, create_node(NUMBER, $3, NULL, NULL), NULL); } stmt_list: /* empty */ { $$ = NULL; } | stmt_list stmt { $$ = create_node(STMT_LIST, $1, $2, NULL); } stmt: expr SEMICOLON { $$ = create_node(EXPR_STMT, $1, NULL, NULL); } | LBRACE stmt_list RBRACE { $$ = create_node(BLOCK, $2, NULL, NULL); } | IF LPAREN expr RPAREN stmt { $$ = create_node(IF_STMT, $3, $5, NULL); } | IF LPAREN expr RPAREN stmt ELSE stmt { $$ = create_node(IF_ELSE_STMT, $3, $5, $7); } | WHILE LPAREN expr RPAREN stmt { $$ = create_node(WHILE_STMT, $3, $5, NULL); } | FOR LPAREN expr SEMICOLON expr SEMICOLON expr RPAREN stmt { $$ = create_node(FOR_STMT, create_node(EXPR_STMT, $3, NULL, NULL), create_node(EXPR_STMT, $5, NULL, NULL), create_node(EXPR_STMT, $7, NULL, NULL), $9); } | DO stmt WHILE LPAREN expr RPAREN SEMICOLON { $$ = create_node(DO_WHILE_STMT, $4, $2, NULL); } | RETURN expr SEMICOLON { $$ = create_node(RETURN_STMT, $2, NULL, NULL); } expr: term { $$ = create_node(EXPR, $1, NULL, NULL); } | expr PLUS term { $$ = create_node(PLUS_EXPR, $1, $3, NULL); } | expr MINUS term { $$ = create_node(MINUS_EXPR, $1, $3, NULL); } term: factor { $$ = create_node(TERM, $1, NULL, NULL); } | term MULT factor { $$ = create_node(MULT_TERM, $1, $3, NULL); } | term DIV factor { $$ = create_node(DIV_TERM, $1, $3, NULL); } | term MOD factor { $$ = create_node(MOD_TERM, $1, $3, NULL); } factor: NUM { $$ = create_node(NUMBER, $1, NULL, NULL); } | ID { $$ = create_node(IDENTIFIER, $1, NULL, NULL); } | ID LBRACKET expr RBRACKET { $$ = create_node(ARRAY_ACCESS, $1, $3, NULL); } | LPAREN expr RPAREN { $$ = create_node(EXPR, $2, NULL, NULL); } | MINUS factor { $$ = create_node(NEG_FACTOR, $2, NULL, NULL); } | factor PLUS PLUS { $$ = create_node(POST_INC_FACTOR, $1, NULL, NULL); } | factor MINUS MINUS { $$ = create_node(POST_DEC_FACTOR, $1, NULL, NULL); } | SQUOTE ID SQUOTE { $$ = create_node(CHARACTER, $2, NULL, NULL); } | DQUOTE ID DQUOTE { $$ = create_node(STRING, $2, NULL, NULL); } | func_call { $$ = create_node(EXPR_STMT, $1, NULL, NULL); } func_call: ID LPAREN arg_list RPAREN { $$ = create_node(FUNC_CALL, $1, $3, NULL); } arg_list: /* empty */ { $$ = NULL; } | expr { $$ = create_node(ARG_LIST, $1, NULL, NULL); } | arg_list COMMA expr { $$ = create_node(ARG_LIST, $1, $3, NULL); } %% int yylex(); void yyerror(char *); int main() { yyparse(); return 0; } void yyerror(char *s) { printf("%s\n", s); } ``` 以上代码演示了如何使用lex和yacc实现C语言的词法分析、语法分析,并输出抽象语法树。具体实现中还需要定义Node结构体和相关的操作函数,以及将yacc生成的AST传递到下一步的代码生成中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值