记号

开始...

在编译原理中,记号(token)是源程序的最小语法单位,通常由词法分析器从字符序列中提取出来。记号一般包含两个部分:种别码和属性值。种别码用于标识记号的类型,而属性值则记录了该记号的具体信息。 常见的记号类型包括但不限于以下几类: 1. **关键字(Keywords)** 关键字是编程语言中具有特殊含义的保留字,例如 `program`、`is`、`else`、`then` 等。这些词通常用于定义程序结构或执行特定操作,并且每个关键字都有一个唯一的种别码[^1]。 2. **标识符(Identifiers)** 标识符用于表示变量名、数组名、记录名、过程名等用户自定义的名称。虽然不同的标识符有不同的属性值,但它们共享相同的种别码,因为它们属于同一类别[^1]。 3. **常量(Constants)** 常量可以是整型、浮点型、字符型、布尔型等数据类型的固定值。每种类型的常量通常使用一个统一的种别码,但它们的属性值会根据具体数值进行区分。 4. **运算符(Operators)** 运算符分为多种类型: - **算术运算符**:如 `+`、`-`、`*`、`/`、`++`、`--` 等。 - **关系运算符(Relop)**:如 `>`、`<`、`==`、`!=`、`>=`、`<=` 等,通常被称为 `relop` 类型的记号。 - **逻辑运算符**:如 `&&`、`||`、`!` 等。 这些运算符可能是一词一码,也可能是一型一码,取决于具体的实现需求。 5. **界限符(Delimiters)** 界限符用于分隔语句、表达式或代码块,例如分号 `;`、括号 `()`、大括号 `{}`、赋值符号 `=` 等。每个界限符通常对应一个唯一的种别码[^1]。 6. **字符串常量(String Literals)** 字符串常量是由双引号包围的一系列字符,例如 `"Hello, world!"`。这类记号通常拥有独立的种别码,并携带其内容作为属性值。 7. **注释(Comments)** 虽然注释本身不会被编译器处理为可执行代码的一部分,但在词法分析阶段需要识别并跳过它们。因此,注释也是一种特殊的记号类型,尽管它通常不保留在后续的语法分析过程中[^2]。 8. **预处理器指令(Preprocessor Directives)** 在某些语言中,如 C/C++,预处理器指令(如 `#include`、`#define`)也需要被识别为一种记号,以便在编译前进行相应的处理。 9. **标签(Labels)** 标签通常用于控制流语句,如 `goto` 语句的目标位置。它们通常是标识符的一种特殊形式,并可能拥有独立的种别码。 ### 示例代码:记号类型的定义 以下是一个简单的示例,展示如何在 C 语言中定义记号类型,尤其是关系运算符(`relop`): ```c typedef enum { TOKEN_KEYWORD, TOKEN_IDENTIFIER, TOKEN_CONSTANT, TOKEN_ARITH_OP, TOKEN_RELOP, // 关系运算符 TOKEN_LOGICAL_OP, TOKEN_DELIMITER, TOKEN_STRING_LITERAL, TOKEN_COMMENT, TOKEN_PREPROCESSOR, TOKEN_LABEL } TokenType; typedef struct { TokenType type; char *value; } Token; ``` 在这个示例中,`TOKEN_RELOP` 表示关系运算符记号类型,用于识别 `>`、`<`、`==` 等比较操作符。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值