令牌标识符 WORD 和 NAME 之间有什么区别?

令牌标识符 WORD 和 NAME 之间有什么区别?

在 POSIX 7 中,shell 语法(XCU 中的第 2.10 节)提到了几个令牌标识符。我对两个感到困惑:单词和名称。他们有什么区别?

例如,命令的选项是 WORD 还是 NAME?命令的非可选参数怎么样?

答案1

本节中的所有大写名称均指(可能是机器可编译的)lex语法描述(从2.10.外壳语法)。所询问的功能在第 5 项中进行了澄清:

[NAMEfor]

当。。。的时候TOKEN满足名称要求(参见XBD名称)代币标识符NAME将会产生结果。否则,令牌WORD应被退回。

即(指3.231 名称), ANAME是某种类型的WORD:

在 shell 命令语言中,单词仅由可移植字符集中的下划线、数字和字母组成。 a 的第一个字符姓名不是数字。

并非所有单词都是名称:十进制整数是单词,但不是名称。

关于语法,这些行告诉了yacc符号常量(通过#definelex可能返回什么:

%token  WORD
%token  ASSIGNMENT_WORD
%token  NAME
%token  NEWLINE
%token  IO_NUMBER

yacc语法(规则)开头为

%start  complete_command

您可能会注意到语法中 出现了WORD和。期望在这些点返回那些符号常量。按照惯例,大写名称用于此目的,其他名称只是语法中的规则。NAMEyacclexyacc

解释命令时,shell 解释器只关心第一个 WORD,它期望它是 NAME。它将其他 WORD 作为参数传递给命令,并且命令必须决定它们的含义。这方面的语法yacc很模糊,但请注意对“7a”的引用。书面标准中没有对此进行标记的项目,但它已移交给2.9.1 简单命令对应于语法中的这个簇:

simple_command   : cmd_prefix cmd_word cmd_suffix
                 | cmd_prefix cmd_word
                 | cmd_prefix
                 | cmd_name cmd_suffix
                 | cmd_name

(作为练习,有人可能会尝试完成语法并使其真正匹配术语标准)。

答案2

命令行处理方面的单词通常被理解为许多语言中的单词:(大部分)受空格限制的一组字符。

从技术上讲,是由元字符(未加引号时分隔单词的字符)分隔的一组字符。

第一步从命令行处理的非常清晰的描述:

  1. 将命令拆分为由固定元字符集分隔的标记:SPACE、TAB、NEWLINE、;、(、)、<、>、| 和 &。标记的类型包括单词、关键字、I/O 重定向器和分号。

该线已分为(或标记),标记使用语法规则进行识别并相应地进行标记。


名称只是用于标识某些内容的标签:命令名称、变量名称、参数名称、内置名称等。

相关内容