Qual é a diferença entre o identificador de token WORD e NAME?

1

No POSIX 7, a gramática da shell (Seção 2.10 no XCU) menciona vários identificadores de token. Estou confuso sobre dois: WORD e NAME. Quais são suas diferenças?

Por exemplo, a opção do comando WORD ou NAME? Que tal um argumento não opcional do comando?

    
por Tim 16.03.2016 / 20:11

2 respostas

3

Todos os nomes de letras maiúsculas nesta seção referem-se a descrições (possivelmente compiláveis por máquina) lex da gramática (iniciando em 2.10. Gramática da Shell ). O recurso perguntado é esclarecido no item 5:

[ NAME in for]

Quando o TOKEN atende aos requisitos de um nome (consulte XBD Name ), o identificador de token NAME será o resultado. Caso contrário, o token WORD será retornado.

Isso é (referindo-se a 3.231 Name ), um NAME é um determinado tipo de WORD :

In the shell command language, a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit.

Nem todas as palavras são nomes: um inteiro decimal é uma palavra, mas não um nome.

Em relação à gramática, essas linhas informam yacc quais constantes simbólicas (via #define ) lex podem retornar:

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

enquanto a gramática yacc (regras) começa com

%start  complete_command

Você pode perceber ocorrências de WORD e NAME na gramática. yacc espera que lex retorne as constantes simbólicas nesses pontos. Convencionalmente, nomes maiúsculos são usados para essa finalidade, com outros nomes sendo apenas as regras dentro da yacc gramática.

Ao interpretar um comando, o interpretador de shell só se preocupa com o primeiro WORD, que ele espera ser um NAME. Ele passa as outras WORDs para o comando como parâmetros, e o comando tem que decidir o que isso significa. A gramática yacc é vaga nessa área, mas observe a referência a "7a". Não há nenhum item rotulado para isso no padrão escrito, mas é devolvido a 2.9. 1 Comandos simples correspondendo a este clump na gramática:

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

(como exercício, alguém pode tentar completar a gramática e torná-la realmente compatível com o padrão em relação à terminologia).

    
por 16.03.2016 / 20:53
0

O Word no aspecto de processamento de linha de comando é o que geralmente é entendido como uma palavra em vários idiomas: alguns grupos de caracteres limitados (principalmente) por espaços.

Tecnicamente, um grupo de caracteres é separado por metacaracteres (caracteres que, quando não citados, separam palavras).

O primeiro passo de uma descrição muito clara do comando processamento de linha :

  1. Divide o comando em tokens separados pelo conjunto fixo de metacaracteres: SPACE, TAB, NEWLINE,;, (,), & lt ;, & gt ;, | e & Os tipos de tokens incluem palavras, palavras-chave, redirecionadores de E / S e ponto e vírgula.

Depois que a linha tiver sido dividida em Palavras (ou tokens), os tokens serão identificados usando as regras de sintaxe e etiquetados de acordo com as regras.

Name é apenas um rótulo usado para identificar algo: um nome de comando, um nome de variável, um nome de parâmetro, um nome interno, etc.

    
por 16.03.2016 / 23:05

Tags