`
nbnxyuyun
  • 浏览: 5797 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
管理 Java 类路径 (Windows)
在 Windows 上管理类路径的技巧
 

  文档选项
  打印本页

   将此页作为电子邮件发送




级别: 初级

Elliotte Harold, 副教授, Polytechnic 大学


2007 年 1 月 04 日

类路径是 Java™ 平台中最复杂也最令人头痛的部分之一,但熟练掌握类路径对成为一名专业 Java 程序员来说却又十分关键。在本文中,Elliotte Rusty Harold 为您阐述了类路径和源路径的复杂性,并向您展示了如何在 Windows 中熟练掌握它们。如果您使用的是 UNIX 或 Mac OS X,请参阅本文的 姊妹篇。
类路径可以连接 Java 运行库和文件系统。它定义编译器和解释器应该在何处查找要加载的 .class 文件。它的基本思想是:文件系统的层次结构反映了 Java 包的层次结构,而类路径则定义了文件系统中的哪个目录可以作为 Java 包层次结构的根。

遗憾的是,通常文件系统非常复杂并依赖于平台,而且和 Java 包也不能很好地匹配。尤其是在 Windows 环境中更是如此。Java 是一些 Unix 高手设计的,因而从很多方面来说,这也就意味着它无法很好地与 Windows 约定同步。这样一来,不论是新用户还是资深 Java 程序员都深感类路径的棘手。没错,它的确不是 Java 平台好的一面,它让您到了下班的时候还在忙于调试一个顽固的小问题。

当然采用 Eclipse 这样的优秀 IDE 可以减少管理类路径的一些困难,但只能说是一些,而且前提还必须是一切都正常(但这不大可能,因为总会有一些意外出现)。因此,每个 Java 程序员都必须要全面了解类路径,惟有如此,才有希望调试类路径中所出现的问题。

在本文中,我给出了您所需要了解的有关 Windows 中的 Java 类路径(以及相关源路径)的全部内容。本文的 姊妹篇 则展示了 UNIX 和 Mac OS X 上的类似技术。遵循这里列出的步骤可以防止不必要的类路径故障并能解决出现的大多数问题。

包结构

要掌握类路径,首先应从其源代码入手。每个类都属于一个包,而此包必须 遵守标准的命名约定。简单地说,包的名称要由颠倒的两级域名开始,比如 com.example 或 edu.poly,之后是至少一个或多个单词用于描述包的内容。比方说,假设有一个域名为 elharo.com,如果要创建一个 Fraction 类,可以将其放入如下包中:

com.elharo.math
com.elharo.numbers
com.elharo.math.algebra.fields
在颠倒的域名之后,需要使用单一单词的子包名。不要使用缩写形式,并要保证拼写正确。如果需要,可以使用拼写检查器。大部分与类路径相关的问题都是由在源代码中使用某个单词而在文件系统中使用的却是与之稍有不同的拼写或缩写而引起的。所以最好的做法就是总是使用拼写正确且没有缩写的名称。

整个包名称应该是小写的,即使该名称是在别处常采取大写形式的一些惯用名称和缩写词。Windows 通常不区分文件名中的大小写,但 Java 和一些 UNIX 文件系统却区分。如果需要在不同的系统间移动文件,大小写问题肯定会带来一些麻烦。

包名称必须要全部由 ASCII 字符组成。一些编译器也接受用 Hebrew、Cyrillic、Greek 或其他脚本编写的包名称,但大多数文件系统并不接受;您稍后就会看到,这样的包名称必须担负充当目录名这样的双重任务。Java 包和类名是 Unicode,但很多文件系统(包括 FAT)却不能识别 Unicode。遗憾的是,FAT 系统非常之多。如果只简单地用不同的默认编码将文件复制到系统将会使编译器和解释器无法找到正确的类。

用完即弃的代码

如果您在编写一个只使用一次就丢掉的类 —— 比如测试一个 API 的类 —— 则无需将它放到包中。但需要多次使用的类必须要放到包中。


不要试图在包名称方面节约成本。长远来看,这只会有百害而无一利。如果需要域名就买一个。如果名称太长就买个短些的(我曾经买到了 xom.nu 这样一个域名,因而我的包前缀就只有 6 个字符)。不要将类放到默认包中(默认包是指如果未在类中包含一条包语句时系统默认给出的包)。如果包访问不利于对象间的通信,就需要向类中添加更多的公共方法。需要多次使用的类必须要放到包中。

配置 Windows

文件扩展名和路径对于 Java 和 Windows 来说都很重要。所以在开始下面的步骤之前,务必确保能够看到它们。隐藏部分文件名对终端用户来说还可以接受(但我并不完全这么认为),但对于开发人员来说显然不行。要解决这个问题,需要对 Windows Explorer 的一些默认设置做些更改。

首先在 Windows 桌面打开任意一个文件夹。找到 Tools 菜单,选择 Folder Options。在随后打开的对话框中,确认选择了如下三个选项,如图 1 所示:

“Display the full path in the address bar” 应该选中。
“Display the full path in title bar” 应该选中。
“Hide file extensions for known file types” 应该清除。

图 1. Windows Explorer 选项


您可能还想选中 “Show hidden files and folders”,它对您的 Java 作业没有多大影响,但就我个人而言,我很希望能够看到所操作的所有内容。选中这些选项可以显露关于所做事情的更多细节,使您能更轻松地调试所出现的问题。






回页首




目录结构

下一步要做的是组织源文件来匹配包结构。在某处创建一个干净的空白目录。本文中,我将其命名为 project。如果将该目录放到根级别(比如 C:\project)就会更容易一些。也可以将其放到桌面或 Documents and Settings 文件夹。但这会让输入的命令更长也更为复杂,所以只在十分必要的情况下才这么做(如果您运行的是 Windows XP 或更高,而且没有管理员权限,那您没有什么其他的选择。在单用户系统上,最好是要有管理员权限,这会使情况大大简化)。

无论如何,不要将此目录(或任何其他目录)放到 JDK 文件夹(例如 C:\jdk1.6.0 或 C:\Program Files\Java\j2sdk1.5.0_09)。JDK 和 JRE 目录在初始安装之后应该保持不动。

在 project 目录内,另外创建两个目录: bin 和 src(一些人更喜欢将其分别命名为 build 和 source)。

接下来,在 src 目录,建一个与包层次结构相匹配的层次结构。例如,如果给定类名为 com.elharo.math.Fraction,我会将 com 目录放到 src 目录中,然后在 com 目录中创建一个 elharo 目录,再在 elharo 目录内放一个 math 目录,最后在 math 目录内放上 Fraction.java,如图 2 所示:


图 2. 符合包结构的目录结构


要点:不要在 src 目录中放置除源代码之外的任何内容。通常这里放入的文件都是 .java 文件。在有些情况下,也可放置 .html 文件(用于 JavaDoc)或其他类型的源代码。然而,决不能在此结构内放置 .class 文件或任何其他编译并生成的工件。这样做只会带来麻烦。遗憾的是,如果不够谨慎,javac 编译器就会 “明知故犯”。在下一节,将介绍如何修复这一问题。






回页首




编译

编译 Java 代码需要一些技巧,原因是必须要跟踪如下几方面相关但又有所不同的内容:

后斜线和前斜线

开发出 Java 的 UNIX 程序员允许编译器接受 UNIX 格式的前斜线用来代替 Windows 中的后斜线。因此,以下命令仍有效:

C:\project> javac src/com/elharo/math/Fraction.java


然而,一些命令不允许使用前斜线,要求必须使用后斜线。在 Windows 中使用后斜线最为容易。


正在编译的目标文件。
编译器在其中寻找目标文件导入 .java 文件的那个目录。
编译器在其中寻找目标文件导入 .class 文件的那个目录。
编译器在其中放置编译输出的目录。
默认地,javac 编译器将上述目录都认为是当前目录,而这并不是您所希望的。因此,需要在编译时显式地指定这些元素。

要编译的文件

指定的第一个要编译的文件是 .java 文件,以从当前目录到该文件的整个路径的形式给出。比如,假设当前所在目录是 图 1 所示的 project 目录。该目录包含 src 目录。此 src 目录包含 com 目录,而 com 目录又包含 example 目录,example 目录下是 Fraction.java 文件。如下命令行对它进行编译:

C:\project> javac src\com\elharo\math\Fraction.java


如果路径不正确,就会给出这样的错误消息:

error: cannot read: src\com\example\mtah\Fraction.java



如果出现这样的错误消息,就需要检查路径的各个部分,确保它们拼写正确。在本例中,错误消息显示 math 的第二和第三个字母颠倒了。

如果没有发现拼写错误,请检查该文件是否处于它应该出现的位置,方法是按如下所示发出一个 dir 命令:

C:\project\src> dir src\com\example\math
ls: src/com/example/math: No such file or directory



出现问题的原因通常是因为路径拼写错误,但也可能是由于当前的目录不对。在本例中,需要检查当前的工作目录是不是 project 目录。检查命令行上 C: 和 > 之间的文本,以确认当前目录是否是预期的目录。在本例中,当前目录为 C:\project\src,而预期的目录却是 C:\project。

输出到何处?

假设没有出现任何语法错误,javac 将编译后的 .class 文件放到与之对应的.java 文件所在的相同目录内。这并不是您所想要的结果。将 .class 和 .java 文件混在一起常常会使清理编译后的文件十分困难,因为很可能会意外删除本应保留的 .java 文件。这常会使清理构建十分困难,而且还会导致版本问题。发布一个二进制时,只对编译后的 .class 文件进行归档也会十分困难。因此,需要告知编译器将编译后的输出放到一个完全不同的目录内。-d 开关用来指定输出目录(通常称为 bin、build 或 class):

C:\project> javac -d bin src\com\elharo\math\Fraction.java



这时的输出将如图 3 所示。请注意 javac 已经创建了完整的 com\elharo\math 目录层次结构。不需要手动建立。


图 3. 并行源和编译后的层次结构


源路径

源路径 就是 Java 在其中寻找源文件的那个目录。具体到本例,就是 src 目录。该目录必须包含源文件的层次结构,这些源文件可以被放到它们自己的目录中。因此它不是 com 目录也不是 src\com\elharo\math 目录。

很多项目都使用不止一个类和包。它们通过导入语句和完整的包限定类名连接起来。例如,假设您在 com.elharo.gui 包中创建了 MainFrame 类,如清单 1 所示:


清单 1. 一个包中的类可以导入另一个包中的类

package com.elharo.gui;

import com.elharo.math.*;

public class MainFrame {

  public static void main(String[] args) {
    Fraction f = new Fraction();
    // ...
  }

}


该类使用的是与 MainFrame 类所在的包不同的包中的 com.elharo.math.Fraction 类。源设置现在应该如图 4 所示(我将编译后的输出从之前的步骤中删除了。但这没有关系,因为我总是能重新编译它)。


图 4. 几个包的源结构


现在来看一下试着像以前一样编译 MainFrame.java 会出现什么情况。


清单 2. 编译 MainFrame.java

C:\project> javac -d bin src\com\elharo\gui\MainFrame.java
src\com\elharo\gui\MainFrame.java:3: package com.elharo.math does not exist
import com.elharo.math.*;
^
src\com\elharo\gui\MainFrame.java:7: cannot find symbol
symbol  : class Fraction
location: class com.elharo.gui.MainFrame
  private Fraction f = new Fraction();
          ^
src\com\elharo\gui\MainFrame.java:7: cannot find symbol
symbol  : class Fraction
location: class com.elharo.gui.MainFrame
  private Fraction f = new Fraction();
                           ^
3 errors



出现清单 2 中的错误的原因是,虽然 javac 知道到何处可以找到 MainFrame.java,但它却并不知道到何处可以找到 Fraction.java(您可能觉得它应该具备足够的智能来识别匹配的层次结构,但事实并非如此)。为了给它提供一些线索,必须指定源路径。用源路径指定编译器应该到哪些目录查找源文件的层次结构。在清单 2 中,源路径是 src。所以我使用了 -sourcepath 选项,如下所示:

C:\project> javac -d bin -sourcepath src src\com\elharo\gui\MainFrame.java



现在再编译程序,就不会出现错误,并会产生如图 5 所示的输出。请注意 javac 也编译了文件 Fraction.java,Fraction.java 被当前编译的文件引用。


图 5. 多类输出


编译源路径中的多个目录

在源路径中可以有多个目录,使用分号分隔各目录,但通常没有必要这么做。例如,若我想包括本地的 src 目录和用来存放另一个项目的源代码的 C:\Projects\XOM\src 目录,我可以这样进行编译:

C:\project> javac -d bin -sourcepath src;C:\Projects\XOM\src
  src/com/elharo/gui/MainFrame.java



该命令并不编译在这两个层次结构中所找到的每个文件。它只编译由单个的 .java 文件直接或间接引用的文件,而此 .java 文件必须被编译。

目录名中的空格

Java 类名和包名都不能包含空格。但有时一个包含 Java 包目录或源文件的目录可以包含空格。Documents and Settings 是其中一个最为明显的例子。如果需要在路经中包括一个这样的目录,就必须在相关的命令行参数两端加上双引号。例如,当前目录为根目录 C:,src 文件夹在 C:\Documents and Settings\Administrator\project,则需要像下面这样对它进行编译:

C:\> javac -d bin -sourcepath "C:\Documents and Settings\Administrator\project"
-classpath C:\lib\classes
"C:\Documents and Settings\Administrator\project\src\com\elharo\gui\MainFrame.java"



在很多情况下,大可不必这样做,您完全可以在编译和运行程序前先转换到 project 目录。


更常见的情况是,为 .java 文件用一个单一的源目录,为类或放置了预编译的第三方库的 JAR 归档文件用多个目录。而这正是类路径的作用所在。

设置类路径

在大中型项目中,每次都要对每个文件进行重编译会非常耗时。为减少这种编译负担,可以在不同的 bin 目录分别编译和存储相同项目的独立部分。这些目录被添加到类路径。

将类添加到类路径有几种方法可选。但您只能使用 -classpath 命令行开关。例如,假设我想从另一个之前已经编译到目录 C:\lib\classes 中的项目导入文件,那么我会向命令行添加 -classpath C:\lib\classes,如下所示:

C:\project> javac -d bin -sourcepath src -classpath C:\lib\classes
  src\com\elharo\gui\MainFrame.java



现在假设需要添加两个目录:C:\project1\classes 和 C:\project2\classes,可以将它们用分号分开,如下所示:

C:\project> javac -d bin -sourcepath src
  -classpath C:\project1\classes;C:\project2\classes
  src\com\elharo\gui\MainFrame.java



当然,您也可以使用自己喜欢的各种相对路径的格式。比如,如果 project1 和 project2 是当前工作目录的同级目录(即它们有相同的父目录),那么我会这样引用它们:

C:\project> javac -d bin -sourcepath src
  -classpath ..\project1\classes;..\project2\classes
  src\com\elharo\gui\MainFrame.java



到目前为止,我都一直假设程序完全独立并且没有使用任何单独的编译后的第三方库。如果需要使用第三方库,还必须将它们也添加到类路径。库通常是 JAR 文件的格式,比如 junit.jar 或 icu4j.jar。在本例中,需要向类路径添加的只是 JAR 文件本身,而不是包含 JAR 文件的目录(从实质上讲,JAR 文件可以充当包含编译后的 .class 文件的一种目录)。例如,如下命令会向类路径添加三项内容:目录 C:\classes、当前工作目录中的文件 icu4j.jar 以及 E:\lib 中的文件 junit.jar:

C:\project> javac -d bin -sourcepath src
  -classpath C:\classes;icu4j.jar;E:\lib\junit.jar
  src\com\elharo\gui\MainFrame.java



JAR 文件仅用于 .class 文件和类路径,不用于 .java 文件和源路径。

顶级目录
请注意这里所说的顶级目录是指所有包含包的层次结构的顶级目录。具有匹配包名称(com、elharo、math 等)的目录绝不会直接包括在源路径或类路径中。

运行程序

现在您已经成功地编译了程序,可以运行它了。运行与编译相似但更为简单一些。当运行程序时,只需指定两项内容:

类路径
包含 main() 方法的类的完全限定包名
无需指定源路径。

通常这里的类路径与编译程序所使用的类路径相同,只是多了一个放置编译后的输出的目录。例如,如果编译命令如下所示:

C:\project> javac -d bin -sourcepath src
  -classpath C:\classes;E:\lib\junit.jar
  src\com\elharo\gui\MainFrame.java



并且 main() 方法在类 com.elharo.gui.Mainframe.java 内,就可以像这样运行此程序:

C:\project> java -classpath C:\classes;E:\lib\junit.jar
   com.elharo.gui.MainFrame



请务必注意命令行的最后一项是类名。它不是一个文件名,也不是 .java 或 .class。该类必须能够在类路径的某处找到。






回页首




可能存在类的其他地方

我强烈建议您在编译和运行时总是显式地指定类路径。也可以将文件放到其他地方,以便它们可以被添加到类路径中,并被 javac 编译器和 java 解释器找到。这种做法会节省一些键入操作,但当(注意不是如果)您无意间将一个旧版本的类放到类路径中时,这却会耗费大量的调试时间。

在本节,将展示类常常隐匿其中的几个地点,这些类很可能会出乎意料地冒到类路径中并导致问题的出现。在不受您控制的机器上(比如服务器),这更为多见。

当前工作目录

编译器总是将当前工作目录 (.) 添加到类路径,而不管您是否曾显式地要求这样做。您很容易忘记在和您所在的目录相同的目录中有和没有的内容。因此,请尽量避免将任何类或层次结构放入 project 或 home 目录。相反地,应该将 .java 文件和 .class 文件分别放入 src 目录和 bin 目录。

CLASSPATH

过一会,您就会发现向类路径手工添加 bin 目录和 JAR 归档文件太过繁琐。这时您可能会想要使用 CLASSPATH 环境变量。可以只向 CLASSPATH 环境变量添加一次目录和 JAR 归档文件,之后就不需要在每次运行 javac 或 java 时都要再键入这些路径。

请务必抵制这种诱惑。这样做,一旦加载了错误的类或错误版本的类,就会出问题。而且意外加载错误的类所带来的调试时间常常会百倍于省下的那点键入时间。要避免输入并自动处理类路径有更好的方法。

jre\lib\ext

放在 jre\lib\ext 目录中的 JAR 归档文件会被添加到通过虚拟机运行的所有应用程序的类路径。这看起来很方便,实际上它与向 CLASSPATH 环境变量添加目录一样,存在长远的潜在问题。您迟早(通常很快)会在您想都想不到的地方加载类的一个错误版本的类并会为此付出大量的调试时间。

部署一个服务器端的应用程序时,问题就更为严峻。请确保部署到的服务器在其 jre\lib\ext 目录没有任何额外的 JAR。如果您不熟悉错误症状,也不知道该如何查找,那么由类路径中的错误版本的 JAV 归档文件所带来的问题可能会非常难于调试。为了避免这些问题的出现,一些框架甚至编写了自己的类加载器,用来绕过 Java 代码通常的类加载机制。

jre\lib\endorsed

放在 jre\lib\endorsed 目录中的 JAR 文件也被添加到了通过虚拟机运行的所有应用程序的类路径。不同的是,这里的文件被实际放入了 bootclasspath 而不是通常的类路径,并可以代替 JDK 附带的标准类。这种方式对于在 VM 更新 XML 解析器和修复 bug 尤其有用。

但是,如前所述,这种方法看起来十分方便,但实际上也存在长期的潜在问题,原因也一样。如果需要替换 JDK 类,可以在运行时使用 -Xbootclasspath/p 选项来避免意外地加载错误版本的类。

C:\project> java -classpath C:\classes
       -Xbootclasspath/p:xercesImpl.jar com.elharo.gui.MainFrame







回页首




自动管理类路径

在想要使用电动射钉枪之前要先熟练使用锤子,与此相似,在试图采用更强大的自动管理工具之前也要先能自如地手动管理这些类。如果您掌握了命令行工具集,就可以使用另外的工具来自动处理源路径和类路径所需的一些繁琐过程。这些工具大部分也需要您像本文所介绍的那样组织文件。

IDE

像 Eclipse 和 NetBeansMost 这样的许多开发环境都能协助类路径的自动管理。例如,当更改包的名称时,Eclipse 能相应地移动对应的 .java 文件,如图 6 所示:


图 6. 在 Eclipse 中快速修复类路径


请记住,这些 IDE 位于文件系统的顶部,必须正确设置,尤其是当需要与其他工具和其他 IDE 集成时就更应如此。这些工具最大的贡献是用 GUI 对话框、树视图和选项卡代替了命令行开关参数,但其基本的文件结构还是一样的。

Ant

Ant 是自动化构建过程的事实上的标准工具。与将目录放在 jre\lib\ext 或 CLASSPATH 环境变量的做法不同,Ant 真的可以让您创建单步的构建过程。但您仍然需要在 Ant build.xml 设置类路径并手动将源文件放到正确的目录。但至少现在您无需在每次编译都要重新进行指定。

Maven

Maven 在组织和自动化构建过程方面比 Ant 还要更进一步。Maven 提供一个合理的默认设置让您可以通过添加少许几行代码并将源文件放到 Maven 能够找到的位置即可构建简单的项目。您仍然需要调整文件系统和包的层次结构。Maven 在管理第三方库的依赖性方面也有上佳的表现,虽然它不如 Ant 那么易于定制。






回页首




结束语

不管类路径有多么棘手,您都可以通过一些简单的规则对它加以管制,尤其是要记住如下的一些原则:

将类放到包中。
严格遵守包和类的命名约定和大小写约定。
确保包的层次结构与目录的层次结构匹配。
总是对 javac 应用 -d 选项。
不要在 jre\lib\ext 内放任何东西。
不要在 jre\lib\endorsed 内放任何东西。
不要将 .java 文件与 .class 文件放在同一个目录。
不要将任何 .java 或 .class 文件放在当前的工作目录。
最后一点提示:很多耗时的类路径问题的起因大都是目录名拼写错误或从错误目录进行了编译。如果您不能找到问题的所在,可以问问周围的朋友或同事。以我的经验,自己发现自己的错误总是困难的,但这些错误在别人看来却显而易见。所以寻求他人的帮助也是一种切实有效的调试技巧。

类路径确实不是个简单的问题,但总会有相应的应对方法,所以它是完全可管理的。些许的谨慎加上对本文所介绍的命名约定、命令行参数和目录结构的注意,应该能够使您在问题最少的情况下编译和运行程序了。




参考资料

学习

您可以参阅本文在 developerWorks 全球站点上的 英文原文 。


“管理 Java 类路径(UNIX 和 Mac OS X)”(Elliotte Harold,developerWorks,2006 年 12 月):本教程的姊妹篇,介绍了如何在 UNIX、Linux 和 Mac OS X 上设置类路径和源路径。


“项目管理: Maven 让事情变得简单”(Charles Chan,developerWorks,2003 年 4 月):介绍如何使用 Maven 进行项目管理。


“IBM Cloudscape:了解 Java 类路径” (Jean Anderson and Susan Cline,developerWorks,2004 年 9 月):介绍了如何为 Cloudscape 和 DerbyExplains 设置 Java 类路径。


“最佳实践: WebSphere Application Server 的 classpath 结构” (WebSphere Best Practices team,developerWorks,2001 年 8 月):关于在 WebSphere Application Server 上管理类路径的建议。


developerWorks technical library for Java:获得有关 Java 平台的技术文章和提示、教程、标准和 IBM 红皮书。



获得产品和技术

下载 Ant:当前 Apache 的顶级项目。


下载 Maven:Java 项目的 Apache 构建管理器。



讨论

参与 developerWorks 论坛。


通过参与 developerWorks blog 加入 developerWorks 社区。



关于作者



  Elliotte Rusty Harold 来自新奥尔良,现在他还定期回老家喝一碗美味的秋葵汤。不过目前,他和妻子 Beth 定居在纽约临近布鲁克林的 Prospect Heights,同住的还有他的猫咪 Charm(取自夸克)和 Marjorie(取自他岳母的名字)。他是 Polytechnic 大学计算机科学的副教授,他在该校讲授 Java 和面向对象编程。他的 Web 站点 Cafe au Lait 已经成为 Internet 上最流行的独立 Java 站点之一,它的姊妹站点 Cafe con Leche 已经成为最流行的 XML 站点之一。 他最近编著的一本书是 Java I/O, 2nd edition。他目前在从事处理 XML 的 XOM API、Jaxen XPath 引擎和 Jester 测试覆盖率工具的开发工作。


分享到:
评论

相关推荐

    三相异步电动机 SIMOTICS TN Series N-compact 1LL8.zip

    **三相异步电动机 SIMOTICS TN Series N-compact 1LL8 技术详解** SIMOTICS TN Series N-compact 1LL8 是西门子公司推出的一款高效、紧凑型三相异步电动机,广泛应用于工业生产和自动化领域。这款电机以其出色的...

    渗透测试工具开发-漏洞银行大咖面对面15-v1ll4n

    渗透测试工具开发-漏洞银行大咖面对面15-v1ll4n

    三相异步电动机 SIMOTICS TN Series N-compact 1LL8[手册].pdf

    西门子 SIMOTICS TN Series N-compact 1LL8 三相异步电动机是一款低压电机,适用于多种工业应用。手册中详细介绍了该电机在操作、安装、调试、运行、检修以及备件管理等环节的详细要求和步骤,同时涵盖了安全提示、...

    LL(1)文法的实现

    LL(1)文法是编译原理中的一个重要概念,它是一种自左向右扫描输入串,一次看一个字符(“1”),并采用左most derivation(“L”)的解析策略。这种文法在编译器设计中常用于构造解析器,因为它允许高效的预测分析。...

    基于C语言实现的LL(1)分析.zip

    资源包含文件:课程报告word+源码 确定文法的文件存储格式,存储文法的非终结符集合、开始符号、终结符集合和产生式规则集合。详细介绍参考:https://blog.csdn.net/newlw/article/details/126048498

    LL1算法(c++)

    LL1解析器是一种在编译原理中常见的自底向上的语法分析方法,它基于一种称为LL(1)的文法。这里的"LL"代表“Left-to-right parsing with Leftmost derivation”,而数字1表示使用一个输入符号的查看窗口。LL1算法的...

    LL(1)文法的判别以及非LL(1)文法的转换(完整可运行代码)

    ### LL(1)文法的判别以及非LL(1)文法的转换知识点解析 #### 实验背景及目的 本实验旨在通过编程的方式实现对上下文无关文法的分析,特别是针对LL(1)文法的判别及其转换。LL(1)文法是一种重要的文法类别,...

    编译原理的LL(1)文法

    **编译原理的LL(1)文法** 在计算机科学领域,编译原理是研究如何将高级编程语言转换为机器可执行代码的理论基础。其中,LL(1)文法是一种重要的上下文无关文法,它在编译器设计中扮演着核心角色。LL(1)文法的理解和...

    编译原理实验八:非LL(1)文法到LL(1)文法的转换

    在编译原理中,文法是描述编程语言结构的重要工具,而LL(1)文法是一种重要的解析技术,常用于自顶向下的语法分析。这个实验主要关注的是如何将一个非LL(1)文法转化为LL(1)文法,以便进行有效的编译过程。 LL(1)文法...

    【编译原理】LL(1)文法分析全过程(FIRST/FLLOW/SELECT集等)实现(c++语言)

    需要创建一个名字叫project.txt的文件来存储要识别的文法

    LL(1)文法(c语言实现)

    LL(1)文法是编译原理中的一个重要概念,它是一种自左向右扫描输入串,按照最左推导(Leftmost Derivation)的方式进行分析,并且在每次选择产生式时仅看一个输入符号(First Set)和一个预测符(Follow Set)的文法...

    LL(1)语法分析程序设计

    【实验内容】 编写一个语法分析程序,对于给定的输入串,能够判断识别该串是否为给定文法的句型。...3.若符合LL(1)文法,由程序自动构造LL(1)分析表; 4.由算法判断输入符号串是否为该文法的句型。

    LL(1)文法分析代码

    LL(1)文法分析是一种在编译原理中常见的自顶向下语法分析方法,它基于一个特定的解析表,即LL(1)分析表。这里的"LL(1)"代表了以下含义:L 表示从左到右扫描输入,L 也代表Leftmost derivation(最左推导),即分析...

    ll(1)语法分析系统

    《LL(1)语法分析系统详解》 在计算机科学领域,编译原理是研究如何将高级编程语言转换为机器可理解的低级语言的关键部分。其中,语法分析是编译器设计的重要环节,它负责解析源代码并构建出程序的抽象语法树(AST)...

    LL(1)文法自动生成语法分析程序的设计

    LL(1)文法自动生成语法分析程序的设计是指根据输入的LL(1)文法,自动构造LL(1)分析表,并生成相应的语法分析程序,以实现LL(1)分析过程。 LL(1)文法的特点是: 1. Left factoring:左因式分解,消除左递归。 2. It...

    LL(1)文法判断程序

    1. 实验内容 1、 让计算机接受一个文法,示例如(仅供参考): G[S] 为: ...2、 编程实现对上述文法是否是LL(1)文法的判断,是则给出肯定回答,否则给出否定回答。 3、判别是否是LL(1)文法 。。。。。。

    简易LL(1)分析器自动生成程序

    LL(1)分析器是一种在编译器设计中常见的前向预测分析方法,它主要用于将源代码转换为可执行代码的语法分析阶段。这个“简易LL(1)分析器自动生成程序”旨在帮助用户理解LL(1)分析器的工作原理,并提供一种自动化的...

    ll(1)语义

    LL(1)语义是编译原理中的一个重要概念,它是一种自左向右(Left-to-Right)的预测分析(Predictive Parsing)方法。在设计编译器时,理解LL(1)语义有助于我们构建高效的词法分析器和语法分析器。下面将详细讲解LL(1)...

    LL(1)语法分析器

    语法分析程序用LL(1)语法分析方法。首先输入定义好的文法书写文件(所用的文法可以用LL(1)分析),先求出所输入的文法的每个非终结符是否能推出空,再分别计算非终结符号的FIRST集合,每个非终结符号的FOLLOW集合,...

Global site tag (gtag.js) - Google Analytics