flex&bison_homework_1

本文探讨了如何改进基础计算器的功能,包括接受仅含注释的行、转换为十六进制计算器、添加位运算符,并讨论了手动扫描器与Flex版本的区别及适用场景。
1.1 Will the calculator accept a line that contains only a comment? Why not? Would it be easier to fix this in the scanner or in the parser?

The program before will not accept a line that contains only a comment. Add “calclist EOL” to “calclist”, (parser), is easier to fix this

// fbcal.y
calclist:
    | calclist exp EOL { printf("= %d\n", $2);}
    | calclist EOL { printf("= 0\n"); }
    ;
1.2 Make the calculator into a hex calculator that accepts both hex and decimal num- bers. In the scanner add a pattern such as 0x[a-f0-9]+ to match a hex number, and in the action code use strtol to convert the string to a number that you store in yylval; then return a NUMBER token. Adjust the output printf to print the result in both decimal and hex.

Using sscanf() to convert Hexadecimal number to decimal. and using %x to print Hexadecimal number

// fbcal.l
0x[A-Fa-f0-9]+ { sscanf(yytext,"%i",&yylval); return NUMBER; }
// fbcal.y
calclist exp EOL { printf("= %d or 0x%x\n", $2, $2);}
1.3 (extra credit) Add bit operators such as AND and OR to the calculator. The obvious operator to use for OR is a vertical bar, but that’s already the unary absolute value operator. What happens if you also use it as a binary OR operator, for example, exp ABS factor?
// fbcal.l
"&" { return AND; }
"|" { return OR; }
// fbcal.y
factor: ter { $$ = $1; }
    | factor MUL ter { $$ = $1 * $3; }
    | factor DIV ter { $$ = $1 / $3; }
    ;
ter:  term
    | ter AND term {$$ = $1 & $3; }
    | ter OR term { $$ = $1 | $3; }
    ;
term: NUMBER { $$ = $1; }
    | OR term { $$ = $2 >= 0 ? $2 : -$2; }
    | OP exp CP { $$ = $2; }
    ;
1.4 Does the handwritten version of the scanner from Example 1-4 recognize exactly the same tokens as the flex version?

This part is not exactly same, yylval might overflow

if (isdigit(c)) {
    int i = c - '0';
    while( isdigit(c = getc(yyin)))
        i = (10*i) + c-'0';
    yylval = i;
}
1.5 Can you think of languages for which flex wouldn’t be a good tool to write a scanner?

I searched on the internet. Flex is not a good tool to scan these languages that ambiguous, such as c++ and javascript

1.6 Rewrite the word count program in C. Run some large files through both versions. Is the C version noticeably faster? How much harder was it to debug?
#include <stdio.h>

int main(int argc, char **argv) {
    int chars = 0;
    int words = 0;
    int lines = 0;
    int inword = 0;
    char s[] = "The boy stood on the burning deck\n shelling peanuts by the peck\n";
    for( int i = 0; s[i] != '\0'; ++i) {
        chars++;
        if (('a'<=s[i] && s[i]<='z') || ('A'<=s[i] && s[i]<='Z')) {
            if (!inword) {
                inword = 1;
                words++;
            }
        } else {
            inword = 0;
        }
        if (s[i] == '\n') lines++;
    }
    printf("%8d%8d%8d\n", lines, words, chars);
    return 0;
}
计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略研究(Matlab代码实现)内容概要:本文研究了计及风电并网运行的微电网及集群电动汽车综合需求侧响应的优化调度策略,并提供了基于Matlab的代码实现。研究聚焦于在高渗透率可再生能源接入背景下,如何协调微电网内部分布式电源、储能系统与大规模电动汽车充电负荷之间的互动关系,通过引入需求侧响应机制,建立多目标优化调度模型,实现系统运行成本最小化、可再生能源消纳最大化以及电网负荷曲线的削峰填谷。文中详细阐述了风电出力不确定性处理、电动汽车集群充放电行为建模、电价型与激励型需求响应机制设计以及优化求解算法的应用。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源、微电网、电动汽车等领域技术研发的工程师。; 使用场景及目标:①用于复现相关硕士论文研究成果,深入理解含高比例风电的微电网优化调度建模方法;②为开展电动汽车参与电网互动(V2G)、需求侧响应等课题提供仿真平台和技术参考;③适用于电力系统优化、能源互联网、综合能源系统等相关领域的教学与科研项目开发。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注模型构建逻辑与算法实现细节,同时可参考文档中提及的其他相关案例(如储能优化、负荷预测等),以拓宽研究视野并促进交叉创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值