Unitățile lexicale ale limbajului Java

Unitățile lexicale, numite și lexeme (engl. token, lexeme)  sunt construcțiile elementare ale limbajului ("atomii" acestuia). Acestea sunt simboluri, formate din unul sau mai multe caractere, care au o anumită semnificație în limbaj. După rolul îndeplinit, unitățile lexicale sunt: identificatori, cuvinte cheie, cuvinte rezervate, literali, separatori,operatori, comentarii și spații.
 
De exemplu, în programul din fișierul AfisareSiruri.java distingem urmatoarele unități lexicale:
    - cuvinte cheie: class, public, static, void;
    - identificatori:   AfisareSiruri, main, String, args, System, out, print, println;
    - literali: "sirul 1", "sirul 2", "AB", "CDE", "ab", "cd", "ef", ;
    - separatori:  {   }   (   )   [   ]   ,   ;
    - operator:  +;
    - comentarii: /* Exersarea metodelor print si println */
           // se afiseaza sub sirul 1

Vom analiza acum separat fiecare din aceste categorii de unități lexicale.

Identificatori

Numele date programelor sau componentelor acestora (clase, variabile, metode etc.) se numesc identificatori. Identificatorii se aleg de către programator, respectând anumite reguli.

În limbajul Java, identificatorii sunt șiruri formate din litere, cifre și caractere de subliniere ('_'), care încep cu o literă. Lungimea identificatorului nu prezintă importanță, însă acesta nu poate conține spații libere sau alte caractere, decât cele menționate aici.
 
Exemple de identificatori valabili:

PrimaClasa
aplha
viteza
v15XB7
pretDeVanzare
pret_de_vanzare

Este clar acum că și exemplele date anterior ( Afisari, main, String, args, System, out, print, println) sunt, de asemenea, identificatori.

Se obișnuiește ca numele de clase să înceapă cu literă majusculă. De asemenea, se obisnuiește ca separarea între cuvinte, în cadrul identificatorilor compuși din mai multe cuvinte ale limbajului natural, să se facă incepând fiecare cuvant nou cu literă majusculă, dar se poate face și prin caracterul de subliniere '_'. Acestea nu sunt însă reguli sintactice, ci doar convenții neobligatorii.

Programatorul poate adopta orice identificatori care respectă regulile și convențiile de mai sus și care nu sunt cuvinte cheie sau cuvinte rezervate. Desigur însă că folosirea unor identificatori care au semnificație pentru om, cum ar fi viteza sau PretDeVanzare este preferabilă celor fără semnificație, cum ar fi v15XB7, deoarece ușurează înțelegerea și urmărirea programului. Amintim însa că, pentru calculator, identificatorii nu au nici o alta semnificație, deci, din acest punct de vedere, toate exemplele de identificatori date aici sunt la fel de bune.

Cuvinte cheie

În orice limbaj de programare, există un set de cuvinte, numite cuvinte cheie, care sunt considerate simboluri sintactice și nu pot fi folosite în program ca identificatori.
 
În limbajul Java, există următoarele cuvinte cheie:
abstract
double
int
strictfp
boolean
else
interface
super
break
extends
long
switch
byte
final
native
synchronized
case
finally
new
this
catch
float
package
throw
char
for
private
throws
class
goto
protected
transient
const
if
public
try
continue
implements
return
void
default
import
short
volatile
do
instanceof
static
while

Dintre acestea,  const  și  goto  nu sunt folosite în prezent, dar ele au fost introduse în tabela cuvintelor cheie în vederea unei eventuale utilizări viitoare.

Observăm acum că toate exemplele de cuvinte cheie date la începutul acestei secțiuni (class, public, static, void) sunt prezente în tabela de mai sus.


 

Cuvinte rezervate

Se consideră cuvinte rezervate acele cuvinte, care nu pot fi folosite ca identificatori, având semnificații speciale. Cuvintele cheie sunt și ele considerate în majoritatea limbajelor, inclusiv Java, drept cuvinte rezervate. În afară de acestea, în limbajul Java există urmatoarele cuvinte rezervate: true, false, null.
Primele două sunt valorile logice adevărat și fals, iar al treilea are semnificația de referință nulă. De fapt, aceste cuvinte rezervate sunt forme speciale de literali.

Literali

Literalii sunt reprezentările în fișierele sursă ale valorilor  constante. Exemple de literali:
    - caractere: 'a', 'A', '+', '$', '5';
    - șiruri de caractere: "sir de caractere", "abc$79.28#^z";
    - numere întregi: 14726, -25413;
    - numere reale:   12.7389, -0.05673, 2.3075E12, -1.4237E-5;
    - valori logice: true, false;
    - referința nulă: null.

Am subliniat faptul că literalul este forma sub care o anumita valoare este reprezentată în fișierul sursă, deci în programul scris în limbaj de nivel superior (în cazul nostru în limbajul Java). Vom arăta ulterior că forma de reprezentare a acelorași valori în memoria internă a calculatorului (forma internă) este diferită de cea externă. Vom reveni asupra regulilor de scriere a literalilor când vom prezenta tipurile de date din limbajul Java.

Separatori

Separatorul este un caracter care delimitează formele sintactice sau le separă între ele. În limbajul Java se folosesc următorii separatori:
                              {  }  (  )  [  ]  ;  ,  .
Spațiul liber și operatorii indeplinesc, de asemenea, rolul de separatori.

Aproape toți acești separatori au fost deja folosiți în exemplele date în acest capitol.
 

Operatori

Operatorii sunt simboluri ale unor operații. Am folosit deja simbolul ca operator de concatenare (deci simbol al operației de concatenare). Operatorul poate fi format din unul sau mai multe caractere.  Entitatea asupra căreia se aplică operatorul se numește operand. După numărul de operanzi, operatorii pot fi unari, binari sau ternari.
 

După numărul de operanzi deosebim:
    operatori unari, care se aplică unui singur operand, de ex. operatorul - în expresia  -x; utilizarea operatorului unar se face, de regula, sub forma "prefix"   operator  operand, în care operatorul se pune în fața operandului; uneori însă se foloseste și forma "postfix"
    operand operator
în care operatorul se pune după operand;
    operatori binari, care se aplică asupra a doi operanzi, operatorul fiind situat între aceștia; de ex. operatorul de concatenare + în expresia "acesta este " + "un exemplu" sau operatorul de adunare a două numere + în expresia  17+28.Operatorii binari se folosesc sub forma "infix"
           operand1  operator  operand2
în care operatorul este situat între cei doi operanzi;
    operatori ternari, care se aplică asupra a trei operanzi; în limbajul Java există un singur operator ternar ( ? :) folosit în expresiile condiționale. Operatorul ternar se scrie sub forma
    operand1 ? operand2 : operand3
în care operand1 are o valoare logică (true sau false), iar ceilalti doi operanzi sunt expresii aritmetice sau logice (dar de același tip).

Din exemplele de mai sus, observăm că semnificația unui operator poate să depindă de context, ca în cazul operatorului +, care a fost folosit atât pentru operația de concatenare a șirurilor, cât și pentru cea de adunare a numerelor.

Din punct de vedere matematic, operatorii sunt funcții cu unul, două sau trei argumente (argumentele fiind operanzii). De exemplu, expresia a+b, în care + este un operator binar, iar a și b sunt operanzi, este o funcție de argumente a si b, care are ca valoare suma valorilor celor două argumente.

După efectul operatorului asupra operanzilor, operatorii pot fi fără efect lateral, care lasa valorile operanzilor nemodificate, și cu efect lateral, care modifică valorile operanzilor. Astfel, operatorul + din exemplul anterior, este un operator fără efect lateral. În schimb, în expresia ++a operatorul de incrementare ++ are efect lateral deoarece, în urma efectuarii operației, valoarea operandului a crește cu o unitate.
 
Dăm aici o listă a operatorilor folosiți în limbajul Java. 

Operatori unari: 

+   -   ++   --   new   !    ~
()      []      {}

Operatori binari

+    -    *    /    % 
==   <=   >=   !=
&    |    ^
&&   || 
<<   >>   >>>
=    +=   -=   *=   /=   &=   |=   ^=   ~=   <<=   >>=   >>>=
   .     instanceof

Operator ternar

?:

Remarcăm că operatorii + și - pot fi atât unari ( ca în expresiile +a sau -a), cât și binari (ca în expresiile a+bsaua-b).

Semnificațiile operatorilor vor fi arătate când se vor prezenta tipurile de date și expresiile.

Comentarii

După cum s-a aratat deja, în fișierele sursă pot fi introduse comentarii, care au rolul de a da omului,care citește programul respectiv, anumite explicații necesare pentru o mai buna înțelegere a acestuia. Din punct de vedere sintactic, întregul comentariu este privit ca o singură unitate lexicală, care este ignorată de către compilator, deci nu are efect asupra codului de octeți generat de acesta.

Spații

Între unitățile lexicale ale programului pot fi introduse oricât de multe spații libere, fără ca acestea să aibă influență asupra sintaxei sau semanticii programului. Mai multe spații libere succesive sunt tratate de compilator ca și când ar fi un singur spațiu.


© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați