HDU_2024 C语言合法标识符

本文介绍了如何使用C语言检查一个字符串是否为合法的标识符。提供了两种方法:一种是通过直接比较字符,另一种是利用ctype.h库中的函数进行判断。

只要弄懂什么事C语言的合法标识符就比较简单了,

C语言的合法标志符就是一串只能由字母、数字和下划线组成的字符串,

并且要以字母或下划线开头,

只要记住这个就OK了!^ ^

当然也看到了用#include <ctype.h> 的头文件,

然后以isalpha(int ch)函数判断是否为字母字符,

isalnum(int ch)函数判断是否为字母字符或数字,

运用这个方法会更简单,

把两种方法都贴出来了。

下面是自己编的最原始的代码:

#include <stdio.h>
#include <string>
#include <string.h>
#include <iostream>

using namespace std;

int islegal(char c)
{
 	if (c == '_')
 	    return 1;
    else if (c >= 'a' && c <= 'z')
        return 1;
    else if (c >= 'A' && c <= 'Z')
    	return 1;
    else if (c >= '0' && c <= '9')
    	return 1;
    else return 0;
}

int main()
{
	char c;
	islegal(c);
	int n;
	while (cin >> n)
	{
        getchar();
 	    for (int i = 0; i < n; i ++)
 	    {
		 	char str[100];
		 	gets (str);
		 	int len = strlen (str), flag = 1;
		 	for (int j = 0; j < len; j ++)
			{
				if (!(str[0] >= 'a' && str[0] <= 'z' || str[0] >= 'A' && str[0] <= 'Z' || str[0] == '_'))
				{
					flag = 0;
					break;
				}
				if (islegal(str[j]) == 0)
				{
					flag = 0;
					break;
				}	
			}
			
			if (flag == 0)
			   cout << "no" << endl;
			else cout << "yes" << endl; 
		}
    }
    system ("pause");
    return 0;
}

这个第二种比较简单的方法:

#include <ctype.h>
#include <stdio.h>
int main()
{
    int n, d, i;
    char sym[64];
    scanf("%d%*c", &n);
    while (n--)
    {
        gets(sym);
        if (sym[0] != '_' && !isalpha(sym[0]))
        {
            puts("no");
            continue;
        }
        for (d = i = 1 ; sym[i] ; i++)
        {
            if (!isalnum(sym[i]) && sym[i] != '_')
            {
                d = 0;
                break;
            }
        }
        puts(d ? "yes" : "no");
    }
    return 0;
}


由于没有提供具体的参考引用内容,以下基于一般情况对HDU(杭州电子科技大学)的SysY语言实验进行介绍。 SysY语言是一种类C语言,通常用于编译原理等课程的实验教学。在HDU的相关课程中,SysY语言实验可能包括以下几个方面: ### 词法分析 词法分析是编译的第一步,它将输入的源程序字符串识别为一个个的词法单元(Token)。例如,对于SysY语言的代码,词法分析器需要识别出关键字(如`int`、`if`、`else`等)、标识符、常量、运算符和界符等。以下是一个简单的Python示例,用于对SysY代码进行简单的词法分析: ```python import re # 定义一些正则表达式模式 patterns = [ (r'int', 'INT'), (r'[a-zA-Z_][a-zA-Z0-9_]*', 'IDENTIFIER'), (r'\d+', 'NUMBER'), (r'\+', 'PLUS'), (r'-', 'MINUS'), (r'\*', 'MULTIPLY'), (r'/', 'DIVIDE'), (r';', 'SEMICOLON') ] def tokenize(code): tokens = [] while code: code = code.lstrip() if not code: break for pattern, token_type in patterns: match = re.match(pattern, code) if match: value = match.group(0) tokens.append((token_type, value)) code = code[len(value):] break else: raise ValueError(f"Invalid character in code: {code[0]}") return tokens # 示例代码 code = "int a = 10;" tokens = tokenize(code) for token in tokens: print(token) ``` ### 语法分析 语法分析基于词法分析的结果,根据SysY语言的语法规则,将词法单元序列构造成抽象语法树(AST)。常见的语法分析方法有递归下降分析法、算符优先分析法、LR分析法等。例如,使用Python的`ply`库可以方便地实现一个简单的SysY语法分析器: ```python import ply.yacc as yacc import ply.lex as lex # 词法分析器 tokens = ('INT', 'IDENTIFIER', 'NUMBER', 'PLUS', 'MINUS', 'MULTIPLY', 'DIVIDE', 'SEMICOLON') t_INT = r'int' t_IDENTIFIER = r'[a-zA-Z_][a-zA-Z0-9_]*' t_NUMBER = r'\d+' t_PLUS = r'\+' t_MINUS = r'-' t_MULTIPLY = r'\*' t_DIVIDE = r'/' t_SEMICOLON = r';' t_ignore = ' \t' def t_error(t): print(f"Illegal character '{t.value[0]}'") t.lexer.skip(1) lexer = lex.lex() # 语法分析器 def p_program(p): 'program : INT IDENTIFIER EQUALS NUMBER SEMICOLON' print("Valid program") def p_error(p): if p: print(f"Syntax error at '{p.value}'") else: print("Syntax error at EOF") parser = yacc.yacc() # 示例代码 code = "int a = 10;" parser.parse(code) ``` ### 语义分析 语义分析阶段会对抽象语法树进行检查,确保代码在语义上是合法的。例如,检查变量是否在使用前声明、类型是否匹配等。 ### 代码生成 代码生成阶段将经过语义分析的抽象语法树转换为目标代码,如汇编代码。对于SysY语言实验,可能会将其转换为类似MIPS的汇编代码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值