*(volatile unsigned long *) 语法

#define GPJ2CON (*(volatile unsigned long *) 0xE0200280)

开始对于上面的语法不太理解,但通过拆分,我们可以看的更明白:

1、(unsigned long *)变量,代表“变量”是一个unsigned long类型的指针;例如:(unsigned long *)i ,语句中 i 即为 (unsigned long *)的一个指针;

2、volatile是一个修饰符,告诉编译器此段代码不要优化;因此,(volatile unsigned long *)变量,意思是未优化指针类型的变量;例如:(volatile unsigned long *)i ,语句中 i 即为 (volatile unsigned long *)的一个指针;

3、(volatile unsigned long *) 0xE0200280,此处把变量换成了固定地址,意思是(volatile unsigned long *)指针指向固定的地址 0xE0200280

4、前面再加一个*,即 (volatile unsigned long *) 0xE0200280 代表 GPJ2CON 是一个变量,我们既可以给固定地址中赋值,也可以从固定地址中取值。例如:(volatile unsigned long *)i ,语句中 i 即为 (volatile unsigned long *)的一个指针,而 *i 即代表 i 中存储的值,我们既可以对其赋值,又可以从其中取值;

转载于:https://www.cnblogs.com/zhangpengshou/p/3597646.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于C语言代码的语法分析,可以使用词法分析器和语法分析器来实现。以下是一个简单的基于Flex和Bison的C语言语法分析器的实现代码示例: 首先是使用Flex生成的词法分析器代码: ```c %{ #include "y.tab.h" %} %% "auto" { return AUTO; } "break" { return BREAK; } "case" { return CASE; } // ... [0-9]+ { yylval.num = atoi(yytext); return NUM; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.str = strdup(yytext); return ID; } ";" { return SEMICOLON; } "," { return COMMA; } "+" { return PLUS; } "-" { return MINUS; } "*" { return TIMES; } "/" { return DIVIDE; } "(" { return LPAREN; } ")" { return RPAREN; } "{" { return LBRACE; } "}" { return RBRACE; } "=" { return ASSIGN; } "==" { return EQ; } "!=" { return NEQ; } "<" { return LT; } ">" { return GT; } "<=" { return LTE; } ">=" { return GTE; } "if" { return IF; } "else" { return ELSE; } "while" { return WHILE; } "return" { return RETURN; } "int" { return INT; } "float" { return FLOAT; } "double" { return DOUBLE; } "char" { return CHAR; } "void" { return VOID; } [ \t\n] /* ignore whitespace */ . { yyerror("Unknown character"); } %% int yywrap() { return 1; } ``` 然后是使用Bison生成的语法分析器代码: ```c %{ #include <stdio.h> #include <stdlib.h> #include <string.h> int yylex(); void yyerror(const char*); %} %token AUTO BREAK CASE CHAR CONTINUE DEFAULT DO DOUBLE ELSE ENUM %token EXTERN FLOAT FOR GOTO IF INT LONG REGISTER RETURN SHORT %token SIGNED SIZEOF STATIC STRUCT SWITCH TYPEDEF UNION UNSIGNED %token VOID VOLATILE WHILE %token NUM ID %token PLUS MINUS TIMES DIVIDE ASSIGN SEMICOLON COMMA LPAREN RPAREN LBRACE RBRACE EQ NEQ LT GT LTE GTE %left PLUS MINUS %left TIMES DIVIDE %right UMINUS %start program %% program: declaration_list { printf("Syntax analysis completed successfully!\n"); exit(0); } declaration_list: declaration | declaration_list declaration ; declaration: type_specifier ID SEMICOLON | type_specifier ID LBRACE RBRACE SEMICOLON | type_specifier ID LBRACE parameter_list RBRACE SEMICOLON | type_specifier ID LPAREN RPAREN LBRACE RBRACE | type_specifier ID LPAREN parameter_list RPAREN LBRACE RBRACE | type_specifier ID LPAREN RPAREN SEMICOLON | type_specifier ID LPAREN parameter_list RPAREN SEMICOLON ; type_specifier: INT | FLOAT | DOUBLE | CHAR | VOID ; parameter_list: parameter_declaration | parameter_list COMMA parameter_declaration ; parameter_declaration: type_specifier ID | type_specifier TIMES ID ; %% void yyerror(const char* msg) { printf("Error: %s\n", msg); exit(1); } int main() { yyparse(); return 0; } ``` 这里的例子只是一个简单的示例,实际上C语言的语法非常复杂,需要更复杂的语法分析器来进行处理。此外,使用Flex和Bison生成的代码仅仅是语法分析器的一部分,还需要添加符号表、类型检查、中间代码生成等步骤来实现一个完整的编译器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值