📄 parse.c
字号:
}
else{
if(find_func(token)){ /* call user-defined function */
call();
*value = ret_value;
}
else{
*value = find_var(token); /* get var's value */
}
}
get_token();
return;
case NUMBER: /* is number constant */
*value = atoi(token);
get_token();
return;
case DELIMITER: /* see if character constant */
if(*token == '\''){
*value = *prog;
prog++;
if(*prog != '\'')
sntx_err(QUOTE_EXPECTED);
prog++;
get_token();
return;
}
if(*token == ')') /* process empty expression */
return;
else
sntx_err(SYNTAX); /* syntax error */
break;
/*Rev1.06 yock.yu 05-03-01 start*/
case KEYWORD:
if(tok == SIZEOF){
get_token();
if(*token != '(')
sntx_err(PAREN_EXPECTED);
get_token();
if(token_type == NUMBER){
*value = atoi(token);
if(*value <= 255) *value = 1;
else *value = 2;
get_token();
if(*token != ')')
sntx_err(PAREN_EXPECTED);
get_token();
return;
}
else if((*value = find_type(token)) != -1){
get_token();
if(*token != ')')
sntx_err(PAREN_EXPECTED);
get_token();
return;
}
}
sntx_err(SYNTAX);
break;
/*Rev1.06 yock.yu 05-03-01 end*/
default:
sntx_err(SYNTAX); /* syntax error */
}
}
/* Display an error message */
void sntx_err(int error)
{
char *p, *temp;
int linecount = 0;
register int i;
static char *e[]={
"syntax error",/*SYNTAX*/
"unbalanced parenthese",/*UNBAL_PARENS*/
"no expressoin present",/*NO_EXP*/
"equals sign expected",/*EQUALS_EXPECTED*/
"not a variable",/*NOT_VAR*/
"parameter error",/*PARAM_ERR*/
"semicolon expected",/*SEMI_EXPECTED*/
"unbalanced braces",/*UNBAL_BRACES*/
"type undefine",/*FUNC_UNDEF*/
"type specifier expected",/*TYPE_EXPECTED*/
"too many nested function calls",/*NEST_FUNC*/
"return without call",/*RET_NOCALL*/
"parentheses expected",/*PAREN_EXPECTED*/
"while expected",/*WHILE_EXPECTED*/
"closing quote expected",/*QUOTE_EXPECTED*/
"not a string",/*NO_TEMP*/
"too many local variables",/*TOO_MANY_LVARS*/
"division by zero"/*DIV_BY_ZERO*/
};
printf("\n%s", e[error]);
p = p_buf;
while(p != prog){ /* find line number of error */
p++;
if(*p == '\r'){
linecount++;
}
}
printf(" in line %d\n", linecount);
temp = p;
for(i = 0; i < 20 && p > p_buf && *p != '\n'; i++, p--);
for(i = 0; i < 30 && p <= temp; i++, p++) printf("%c", *p);
longjmp(e_buf, 1); /* return to safe point */
}
/* Get a token */
int get_token(void)
{
register char *temp;
token_type = 0;
tok = 0;
temp = token;
*temp = '\0';
/* skip over white space */
while(iswhite(*prog) && *prog) ++prog;
if(*prog == '\r'){
++prog;
++prog;
while(iswhite(*prog) && *prog)
++prog;
}
if(*prog == '\0'){ /* end of file */
*token = '\0';
tok = FINISHED;
return(token_type = DELIMITER);
}
if(strchr("{}", *prog)){ /* block delimiters */
*temp = *prog;
temp++;
*temp = '\0';
prog++;
return(token_type = BLOCK);
}
/* look for comments */
if(*prog == '/'){
if(*(prog + 1) == '*'){ /* is a comment */
prog += 2;
do{ /* find end of comment */
while(*prog != '*') prog++;
prog++;
}while(*prog != '/');
prog++;
}
}
if(strchr("!<>=", *prog)){ /* is or might be a relation operator */
switch(*prog){
case '=':
if(*(prog + 1) == '='){
prog += 2;
*temp = EQ;
temp++; *temp = EQ; temp++;
*temp = '\0';
}
break;
case '!':
if(*(prog + 1) == '='){
prog += 2;
*temp = NE;
temp++; *temp = NE; temp++;
*temp = '\0';
}
break;
case '<':
if(*(prog + 1) == '='){
prog += 2;
*temp = LE; temp++; *temp = LE;
}
else{
prog++;
*temp = LT;
}
temp++;
*temp = '\0';
break;
case '>':
if(*(prog + 1) == '='){
prog += 2;
*temp = GE; temp++; *temp = GE;
}
else{
prog ++;
*temp = GT;
}
temp++;
*temp = '\0';
break;
}
if(*token)
return(token_type = DELIMITER);
}
if(strchr("+-*/^%=;(),'", *prog)){ /* delimiter */
/* Rev 1.02 yock.yu 05-02-09 start */
if((*prog == '+') && (*(prog + 1) == '+')){
prog += 2;
*temp = AD; temp++; *temp = AD;
}
else if((*prog == '-') && (*(prog + 1) == '-')){
prog += 2;
*temp = DE; temp++; *temp = DE;
}
/* Rev 1.03 yock.yu 05-02-12 start*/
else if(strchr("+-*/^%", *prog) && (*(prog + 1) == '=')){
switch(*prog){
case '+':
*temp = AQ; temp++; *temp = AQ;
break;
case '-':
*temp = DQ; temp++; *temp = DQ;
break;
case '*':
*temp = MQ; temp++; *temp = MQ;
break;
case '/':
*temp = VQ; temp++; *temp = VQ;
break;
case '^':
*temp = RQ; temp++; *temp = RQ;
break;
case '%':
*temp = OQ; temp++; *temp = OQ;
break;
}
prog += 2;
}
/* Rev 1.03 yock.yu 05-02-12 end*/
else{
/* Rev 1.02 yock.yu 05-02-09 end */
*temp = *prog;
prog++; /* advance to next position */
}/*Rev 1.02 yock.yu 05-02-09*/
temp++;
*temp = '\0';
return(token_type = DELIMITER);
}
if(*prog == '"'){ /* quoted string */
prog++;
while(*prog != '"' && *prog != '\r')
*temp++ = *prog++;
if(*prog == '\r')
sntx_err(SYNTAX);
prog++; *temp = '\0';
return(token_type = STRING);
}
if(isdigit(*prog)){ /* number */
while(!isdelim(*prog))
*temp++ = *prog++;
*temp = '\0';
return(token_type = NUMBER);
}
if(isalpha(*prog)){ /* var or command */
while(!isdelim(*prog) && (*prog != '{'))/*Rev 1.04 yock.yu 05-02-18*/
*temp++ = *prog++;
token_type = TEMP;
}
*temp = '\0';
/* See if a string is a command or a variable */
if(token_type == TEMP){
tok = look_up(token); /* convert to internal rep */
if(tok)
token_type = KEYWORD; /* is a keyword */
else
token_type = IDENTIFIER;
}
return token_type;
}
/* Return a token to input stream */
void putback(void)
{
char *t;
t = token;
for(; *t; t++)
prog--;
}
/*
Look up a token's internal representation
int the table.
*/
int look_up(char *s)
{
register int i;
char *p;
/* convert to lowercase */
p = s;
while(*p){
*p = tolower(*p);
p++;
}
/* see if token is in table */
for(i = 0; *table[i].command; i++){
if(!strcmp(table[i].command, s))
return table[i].tok;
}
return 0; /* unknown command */
}
/*
Return index of internal library function or
-1 if not found.
*/
int internal_func(char *s)
{
register int i;
for(i = 0; intern_func[i].f_name[0]; i++){
if(!strcmp(intern_func[i].f_name, s))
return i;
}
return -1;
}
/* Make sure token is word. */
int is_alpha(char c)
{
return((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
}
/* Return 1 if c is a delimiter. */
int isdelim(char c)
{
if(strchr(" !;,+-<>'/*%^=()", c) || c == 9 ||
c == '\r' || c == 0)
return 1;
return 0;
}
/* Return 1 if c is space or tab. */
int iswhite(char c)
{
if(c == ' ' || c == '\t')
return 1;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -