📄 varproc_1.c
字号:
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include "datatypedef.h"
#include "input.h"
#include "string.h"
#include "token.h"
#include "debug.h"
extern char* token;
extern VAR_LVL_RECORD* CurVarRec;
int isnum(int tok)
{
if (tok == ICON || tok == FCON) {
return 1;
} else {
return 0;
}
}
int isoperator(int tok)
{
if(tok == '+' || tok == '-' || tok == '*' || tok == '/' ||
tok == '!' || tok == '=' || tok == '>' || tok == '<' ||
tok == '&' || tok == '|' || tok == '~' || tok == '^' ||
(tok >= 50 && tok <= 57) // &&, ||, <=, ==, !=, >=, >>, <<
) {
return 1;
} else {
return 0;
}
}
/*
if while for 语句中表达式的检测
ID/NUM
+-------------+
| |
ID \/ OP |
[START]------->[Finish]-------->[S1]
| /\
(| |) )
| |<----------+
\/ | ID/NUM | ,
[ S2 ]------->[S3]------>[S4]
/\ |
| ID/NUM |
+----------+
可以是ID,ID OP ID,Func(ID,...)
*/
static int line_no;
static char* varname = NULL;
int Expr_check_start();
int Expr_check_finish();
int Expr_check_state1();
int Expr_check_state2();
int Expr_check_state3();
int Expr_check_state4();
int Expr_check_start(void)
{
int tok = -1;
tok = gettok();
if( tok == EOI ) {
return -5;//END_OF_FILE
}
if(tok == ID){
varname = token;
line_no = lineno;
if(varname == NULL) {
printf("[%s][%d]:error id\\n", __FILE__, __LINE__);
exit(1);
}
return Expr_check_finish();
} else {
printf("[%s][%d]:wrong express\n", __FILE__, __LINE__);
return -1;
}
}
int Expr_check_state1()
{
int tok = -1;
tok = gettok();
if(tok == EOI) {
return -5;
}
if (tok == ID) {//当前是变量名称
varname = token;
line_no = lineno;
if (varname == NULL) {
printf("[%s][%d]:error id\n", __FILE__, __LINE__);
exit(1);
}
//把这个变量加入到变量表中
varname = NULL;
return Expr_check_finish();
}else if (isnum(tok)){
return Expr_check_finish();
} else {
printf("[%s][%d]: error input\n", __FILE__, __LINE__);
return -1;
}
}
int Expr_check_state2()
{
int tok = -1;
tok = gettok();
if(tok == EOI) {
return -5;
}
if (tok == ID) {//当前ID是变量
varname = token;
line_no = lineno;
if (varname == NULL) {
printf("[%s][%d]:error id\n", __FILE__, __LINE__);
exit(1);
}
//把变量插入到变量表中
{
}
varname = NULL;
return Expr_check_state3();
} else if (isnum(tok)) {
return Expr_check_state3();
}else if (tok == ')') {
return Expr_check_finish();
} else {//
return -1;
}
}
int Expr_check_state3()
{
int tok = -1;
tok = gettok();
if(tok == EOI) {
return -5;
}
if (tok == ',') {
return Expr_check_state4();
} else if (tok == ')') {
return Expr_check_finish();
} else {
return -1;
}
}
int Expr_check_state4()
{
int tok = -1;
tok = gettok();
if(tok == EOI) {
return -5;
}
if (tok == ID) {
varname = token;
line_no = lineno;
//加入变量表
{
}
varname = NULL;
line_no = 0;
return Expr_check_state3();
} else if (isnum(tok)) {
return Expr_check_state3();
} else {
return -1;
}
}
int Expr_check_finish()
{
int tok = -1;
tok = gettok();
if( tok == EOI ) {
return -5;//END_OF_FILE
}
if (isoperator(tok)){//当前ID是变量名称,调用状态2处理
//把这个变量加入到变量表中
varname = token;
line_no = lineno;
{
}
varname = NULL;
line_no = 0;
return Expr_check_state1();
} else if (tok == '('){ //当前ID是函数名称,调用状态3处理
varname = NULL;
return Expr_check_state2();
} else {
if (varname) {
//把这个变量加入到变量表中
{
}
varname = NULL;
line_no = 0;
}
return tok;
}
}
/*
变量定义,函数声明,函数定义
[START]
|
| TYPE(int float double char ...)
\/
[S1]
|
| ID
\/ =
[S3]<--------------[S2]------------->[S9]<--------\
| | | |
|TYPE | , | |
\/ | | ID/NUM |
[S12] | | |
| \/ , \/ |
|ID [S7]<------------[S10]<--\ |
{ \/ | | | | =
[FUN1}<-------[S6]<-------[S4]<-----\ | | | |
| | | | |ID |OP |ID |
| | | , |ID | | |NUM |
| | | | | \/ | |
| | | [S13] | [S11]---/ |
| | | /\ | |
| | | | [S8]---------------------------/
| | \/ |TYPE | ;
| | [S5]-----/ |
| | : \/
| \------->[FUN2]------------->[FINISH]
| /\
| |
\--------------------------------------------/
变量定义中没有数组,没有指针,没有自定义数据类型(只包含基本数据类型:int char long short )
*/
int Define_proc();
int Define_check_state1();
int Define_check_state2();
int Define_check_state3();
int Define_check_state4();
int Define_check_state5();
int Define_check_state6();
int Define_check_state7();
int Define_check_state8();
int Define_check_state9();
int Define_check_state10();
int Define_check_state11();
int Define_check_Fun1();
int Define_check_Fun2();
int Define_check_finish();
static int tokTemp;
int Define_check_state1()
{
int tok = -1;
tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
if(tok == ID) {
//需要根据后一个符号决定是否保存到变量表中
varname = token;
line_no = lineno;
return Define_check_state2();
} else {
return -1;
}
}
int Define_check_state2()
{
int tok = gettok();
if (tok == EOI) {
return -5; // end of file
}
switch(tok) {
case '(':
//函数定义,建立新的作用域
{
VAR_LVL_RECORD *temp = NULL;
temp = (VAR_LVL_RECORD*)malloc(sizeof (VAR_LVL_RECORD));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -