• No results found

3 Erstatning som rettsvirkning ved seksuell trakassering

3.3 Ansvarsgrunnlag

acesse identificadores de outros m´odulosM2,M3 , · · ·,Mn, o m´odulo M1 deve importar M2,

M3 , · · ·,Mn. Os identificadores vis´ıveis em M1 s˜ao os declarados com visibilidadepublic

nos m´odulos importados e os identificadores declarados sem modificador de visibilidade, desde que o m´odulo de declara¸c˜ao do identificador perten¸ca ao mesmo pacote de M1.

3.2

Elementos do M´odulo Principal

O m´odulo principal de uma especifica¸c˜ao em Notus, denominado Main, define os se- guintes elementos:

• fun¸c˜ao de pr´e-processamento do arquivo de entrada, fp;

• s´ımbolo inicial da gram´atica, s, pertencente ao dom´ınio sint´atico S; • arquivos de entrada, hi1, i2, · · · , imi;

• arquivos de sa´ıda, ho1, o2, · · · , oni;

• fun¸c˜ao semˆantica de avalia¸c˜ao da AST, fsem.

A partir dessa especifica¸c˜ao Notus, seu compilador gera as fun¸c˜oes de an´alise l´exica, (scanner ) e a fun¸c˜ao de an´alise sint´atica (parser ). O scanner obt´em os tokens do arquivo fonte pr´e-processado, e o parser produz a ´arvore de sintaxe abstrata (AST ) a partir desses tokens.

O compilador Notus cria tamb´em, a partir dos arquivos e fun¸c˜oes listados nesta se¸c˜ao, a fun¸c˜ao principal main em Haskell, que comanda a execu¸c˜ao do interpretador gerado. Assim, toda a especifica¸c˜ao ´e executada na forma de um interpretador que opera sobre um programa fonte fornecido em arquivo de entrada e opcionalmente sobre uma seq¨uˆencia de entrada, produzindo pelo menos uma seq¨uˆencia de sa´ıda. A execu¸c˜ao do interpretador gerado ´e esquematicamente apresentada no diagrama da Figura 3.1.

O interpretador gerado recebe como primeiro argumento, na linha de comando, o nome do arquivo contendo o programa fonte a ser interpretado, arq.L, que ´e lido e transformado em um string chamado source, que cont´em todas as linhas de arq.L. O string source ´e passado como argumento para a fun¸c˜ao de pr´e-processamento, que re- tornar´a um novo string source= f

p source. Os analisadores l´exico e sint´atico, Scanner

e Parser, atuam sobre o string pr´e-processado source. O Parser ent˜ao produz a AST

correspondente ao programa fonte. Em seguida, a fun¸c˜ao semˆantica fsem recebe como

argumentos a AST e a seq¨uˆencia de entradas hi1, i2, · · · , imi, produzindo como resul-

arq.L File reader source fp source’ Scanner Parser AST fsem <i1,i2,...,in> <o1,o2,...,om> tokens

Figura 3.1: Esquema de execu¸c˜ao do interpretador gerado para uma linguagem espe- cificada em Notus

ser lido da entrada padr˜ao ou de arquivos texto; da mesma forma, cada ok corresponde

a um string que ser´a escrito na sa´ıda padr˜ao ou em arquivo texto.

Apresenta-se a seguir a declara¸c˜ao dos elementos do m´odulo principal e os valores default de cada um.

3.2.1

Fun¸c˜ao de Pr´e-processamento

A fun¸c˜ao de pr´e-processamento fp ´e definida na especifica¸c˜ao da linguagem por meio

da cl´ausula hpreproc fpi, e pertence ao dom´ınio String→ String.

Algumas linguagens, como Haskell, definem regras de simplifica¸c˜ao de sintaxe, que permitem ao programador a omiss˜ao de alguns delimitadores, que podem ser deduzidos pelo contexto. A fun¸c˜ao de pr´e-processamento, ao mapear um string de entrada em um novo string, permite que linguagens com essa caracter´ıstica sejam definidas em Notus.

3.2. Elementos do M´odulo Principal 31 Essa fun¸c˜ao ´e opcional, e caso essa n˜ao seja definida, o string corresponde ao pro- grama de entrada para o interpretador ´e passado diretamente ao analisador l´exico.

3.2.2

S´ımbolo Inicial da Gram´atica

O s´ımbolo inicial da gram´atica ´e definido por meio da cl´ausula hsyntax si, onde s ´e

uma vari´avel de gram´atica concreta pertencente a um dom´ınio S. O s´ımbolo inicial determina o dom´ınio da raiz da AST produzida pelo analisador sint´atico. Caso o s´ımbolo inicial da gram´atica n˜ao seja definido, gera-se uma advertˆencia de compila¸c˜ao, e o interpretador resultante n˜ao conter´a a fun¸c˜ao main.

3.2.3

Seq¨uˆencias de Entrada

Seq¨uˆencias de entradas s˜ao definidas por meio da cl´ausulainput in-1, in-2, ... , in-n, onde cada in-i pode ser igual a:

• stdin: indica que os dados da seq¨uˆencia s˜ao lidos da entrada padr˜ao;

• um string entre aspas duplas: indica que os dados da seq¨uˆencia s˜ao lidos de um arquivo cujo nome ´e o string;

• um identificadorfileId: indica que os dados da seq¨uˆencia s˜ao lidos de um arquivo a ser associado a fileId. A associa¸c˜ao ´e realizada na linha de comando do interpretador, e possui a forma: fileId=file-name.

Cada arquivo de entrada deve existir e estar associado a permiss˜oes que autorizam a sua leitura. Caso essas condi¸c˜oes sejam violadas para qualquer um dos arquivos de entrada, ocorrer´a um erro de execu¸c˜ao. Por exemplo, a cl´ausula input a seguir:

i n p u t s t d i n , ” i n 1 . t x t ” , i n 2 ;

define que o interpretador manipula trˆes seq¨uˆencias de entrada, a primeira seq¨uˆencia ´e lida da entrada padr˜ao, a segunda ´e lida do arquivo in1.txt, e a terceira ´e lida do arquivo associado ao identificador in2 na linha de comando do interpretador.

Cada seq¨uˆencia ´e manipulada pela fun¸c˜ao semˆantica como um string. Notus dispo- nibiliza fun¸c˜oes pr´e-definidas, listadas na Tabela 3.1 para manipula¸c˜ao das seq¨uˆencias de entrada.

A cl´ausula input ´e opcional e, caso o m´odulo principal n˜ao a defina, considera-se que o interpretador n˜ao manipula seq¨uˆencias de entrada ou manipula somente a entrada padr˜ao, de acordo com a assinatura da fun¸c˜ao semˆantica (veja Se¸c˜ao 3.2.5).

Fun¸c˜ao Dom´ınio Descri¸c˜ao

trim String→ String Ignora caracteres em branco no in´ıcio da seq¨uˆencia.

nextInt String→ Int Retorna o pr´oximo inteiro de uma seq¨uˆencia, ignorando

caracteres em branco no in´ıcio.

ignoreInt String→ String Ignora caracteres em branco e o primeiro n´umero inteiro

no in´ıcio da seq¨uˆencia.

readLine String→ String Retorna todos os caracteres at´e o primeiro fim de linha

da seq¨uˆencia.

ignoreLine String→ Int Ignora a primeira linha da seq¨uˆencia.

Tabela 3.1: Tabela de fun¸c˜oes pr´e-definidas para manipula¸c˜ao de seq¨uˆencias de entrada

3.2.4

Seq¨uˆencias de Sa´ıda

Seq¨uˆencias de sa´ıda s˜ao definidas por meio da cl´ausulaoutput out-1, out-2, ... , in-n, onde cadaout-i pode ser da forma:

• stdout: indica que os dados da seq¨uˆencia s˜ao escritos na sa´ıda padr˜ao;

• um string entre aspas duplas: indica que os dados da seq¨uˆencia s˜ao escritos em um arquivo cujo nome ´e o string, sobrescrevendo o conte´udo do arquivo caso ele j´a exista;

• append fileName, onde fileName ´e um string entre aspas duplas, indicando que os dados da seq¨uˆencia s˜ao escritos no fim do arquivo de nomefileName, caso ele j´a exista;

• um identificador fileId: indica que os dados da seq¨uˆencia s˜ao escritos em um arquivo a ser associado a fileId, sobrescrevendo o conte´udo do arquivo, caso

ele j´a exista. A associa¸c˜ao ´e realizada na linha de comando do interpretador, e possui a forma fileId=file-name.

• append fileId, onde fileId´e um identificador a ser associado a um arquivo. Os dados da seq¨uˆencia s˜ao escritos no fim do arquivo associado `afileId, caso ele j´a exista. A associa¸c˜ao ´e realizada na linha de comando do interpretador, e possui a forma fileId=file-name.

Arquivos de sa´ıda n˜ao existentes s˜ao criados durante a interpreta¸c˜ao. Por exemplo, a cl´ausula outputa seguir:

3.2. Elementos do M´odulo Principal 33 define que o interpretador possui trˆes seq¨uˆencias de sa´ıda: a primeira ´e escrita na sa´ıda padr˜ao; a segunda no arquivo de nome out1.txt, e a terceira no arquivo associado ao identificador out2 na linha de comando do interpretador. Caso o arquivo out1.txt j´a exista, a escrita ´e feita ap´os o seu ´ultimo caractere; e caso o arquivo associado a out2

j´a exista, o seu conte´udo ´e sobrescrito.

Na ausˆencia da cl´ausula output gera-se uma advertˆencia de compila¸c˜ao, e o inte- pretador escreve todas as seq¨uˆencias na sa´ıda padr˜ao.

3.2.5

Defini¸c˜ao de Fun¸c˜ao Semˆantica

A fun¸c˜ao de avalia¸c˜ao da AST ´e respons´avel por iniciar a interpreta¸c˜ao do programa fonte e ´e definida por meio da cl´ausula semantics f, onde f ´e uma fun¸c˜ao com uma

das seguintes assinaturas:

1. S → String: indica que f n˜ao manipula entrada e produz uma ´unica seq¨uˆencia de sa´ıda;

2. S → String*: indica que f n˜ao manipula entrada e produz qualquer n´umero de seq¨uˆencias de sa´ıda;

3. S→ String→ String: indica quef manipula uma ´unica seq¨uˆencia de entrada e produz uma ´unica seq¨uˆencia de sa´ıda;

4. S → String→ String*: indica que fmanipula uma ´unica seq¨uˆencia de entrada e produz qualquer n´umero de seq¨uˆencias de sa´ıda;

5. S → String* → String: indica que f manipula qualquer n´umero de seq¨uˆencias de entrada e produz uma ´unica seq¨uˆencia de sa´ıda;

6. S → String*→ String*: indica que f manipula qualquer n´umero de seq¨uˆencias

de entrada e produz qualquer n´umero de seq¨uˆencias de sa´ıda.

Em todos os casos, o primeiro parˆametro def, S, deve ser o dom´ınio da raiz da AST, definida pela cl´ausula syntax, ou seja, S´e o dom´ınio do s´ımbolo inicial da gram´atica.

A assinatura da fun¸c˜ao semˆantica deve corresponder ao que ´e definido pelas cl´ausulas input e output do m´odulo principal, sendo que em algumas situa¸c˜oes assume-se um comportamento default, e em outras geram-se advertˆencias ou erros de compila¸c˜ao ou execu¸c˜ao. Por exemplo, se a fun¸c˜ao semˆantica pertencer ao caso 1 e o m´odulo principal definir uma seq¨uˆencia de entrada, ent˜ao emite-se uma advertˆencia na compila¸c˜ao e a seq¨uˆencia de entrada definida ´e ignorada. Se a fun¸c˜ao semˆantica pertencer ao caso 3 e n˜ao forem definidas seq¨uˆencias de entrada ou de sa´ıda, ent˜ao emite-se uma advertˆencia

na compila¸c˜ao, e o c´odigo gerado utiliza a entrada e sa´ıda padr˜ao como comportamento default. Um erro de execu¸c˜ao ocorre quando as cl´ausulasinputououtputindicam que a entrada ou a sa´ıda ser´a definida por um identificador a ser associado na linha de comando do interpretador, e o mesmo n˜ao ´e realizado no momento da chamada ao interpretador.