编译原理习题CH3-1
编译原理习题CH3-1
3.1.1 练习
题目:
将以下 C++ 程序分解为适当的词法单元(lexemes),并给出这些词法单元应该关联的词法值:
1 | float limitedSquare(x){ |
答案解析:
词法单元(lexemes)是编程语言的基本单位,如关键字、标识符、运算符、常量等。通过分析代码中的每个部分,找到其对应的词法单元:
1 | <float> <id, limitedSquare> <(> <id, x> <)> <{> |
分析:
<float>
: 关键字,表示数据类型。<id, limitedSquare>
: 标识符,表示函数名。<(
和<)
: 分别表示左括号和右括号,标识函数参数列表的开始和结束。<id, x>
: 标识符,表示函数参数和变量。<return>
: 关键字,表示函数返回语句。<op, "<=">
: 运算符,表示小于等于。<num, -10.0>
: 数字常量,表示-10.0。<op, "||">
: 运算符,表示逻辑或。<op, ">=">
: 运算符,表示大于等于。<num, 10.0>
: 数字常量,表示10.0。<op, "?">
: 运算符,表示三元运算符。<num, 100>
: 数字常量,表示100。<op, ":">
: 运算符,表示三元运算符的另一部分。<id, x>
: 标识符,表示变量x。<op, "\*">
: 运算符,表示乘法。<id, x>
: 标识符,表示变量x。
通过这种分解方式,可以看出每个部分的词法单元及其对应的词法值。
3.1.2 练习
题目:
标签语言(如 HTML 或 XML)与传统的编程语言有所不同,标签(tags)通常非常多(如 HTML),或者是用户自定义的(如 XML)。此外,标签可以有参数。请建议如何将以下 HTML 文档分解为适当的词法单元,并给出它们应该关联的词法值:
1 | Here is a photo of <b>my house</b>; |
答案解析:
HTML 文档中的词法单元包括文本节点、标签节点和属性等。通过分析 HTML 代码,以下是词法单元的分解:
1 | <text, "Here is a photo of"> <nodestart, b> <text, "my house"> <nodeend, b> |
分析:
<text, "Here is a photo of">
: 文本节点,表示纯文本内容。<nodestart, b>
: 标签节点,表示开始的<b>
标签,表示加粗。<text, "my house">
: 文本节点,表示加粗标签内的内容。<nodeend, b>
: 标签节点,表示结束的</b>
标签。<nodestart, p>
: 标签节点,表示开始的<p>
标签,表示段落。<selfendnode, img>
: 自闭合标签,表示<img>
标签,它没有结束标签。<selfendnode, br>
: 自闭合标签,表示<br>
标签,表示换行。<text, "see">
: 文本节点,表示普通文本“see”。<nodestart, a>
: 标签节点,表示开始的<a>
标签,表示超链接。<text, "More Picture">
: 文本节点,表示链接中的文本内容。<nodeend, a>
: 标签节点,表示结束的</a>
标签。<text, "if you liked that one.">
: 文本节点,表示普通文本内容。<nodeend, p>
: 标签节点,表示结束的</p>
标签。
总结:
- HTML 文档中的词法单元包括 文本节点 和 标签节点(包括自闭合标签和有开始和结束标签的节点)。对于每个标签,除了标签名称外,还可能包含属性(如
<img src="house.gif"/>
)。通过分解文档内容,可以明确地把文本和标签分别处理,并为每个标签和文本分配适当的词法值。
总结
词法分析的目标是将源代码(或文本)分解成基本的词法单元,这些词法单元是编译过程中的基础部分。对于编程语言和标记语言,分词的方法略有不同:
- 编程语言:词法单元通常包括关键字、标识符、常量、运算符等。
- 标记语言(如 HTML):除了常规的文本,还涉及标签、属性等元素。
通过精确的词法分析,可以有效地为语法分析奠定基础,识别文法错误和代码结构。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论