توکن (Token)

توکن (Token) در لغت بمعنای: علامت، نشانه، رمز، علامت رمزی، یادآور و یادبود می‌باشد. در واقع توکن چیزی است که نشان‌دهندهٔ چیز دیگری است (چه مادی و چه غیر مادی)؛ مانند یک شیء یا یک مفهوم انتزاعی. مثلا یک هدیه را می‌توان بعنوان یک توکن در نظر گرفت؛ زیرا نشانه‌ای (رمزی) از ارزش قائل شدن فرد هدیه‌دهنده به فرد گیرنده می‌باشد.

توکن در مسائل امنیتی می‌تواند فیزیکی (سخت‌افزاری) یا غیر فیزیکی (غیر سخت‌افزاری) باشد. فیزیکی مانند یک Device که به رایانه متصل می‌شود و برای احراز هویت مورد استفاده قرار می‌گیرد. توکن غیر فیزیکی هم مانند پسورد ورود می‌باشد؛ که برای احراز هویت فرد برای ورود (مثلا به یک سایت) استفاده می‌شود.

توکن در برنامه‌نویسی

توکن در برنامه‌نویسی به کوچک‌ترین المان (عنصر) برنامه گفته می‌شود که برای کامپایلر معنادار می‌باشد. می‌توان آن‌ها را مانند زیر تقسیم‌بندی کرد:
۱. کلمات کلیدی (Keywords)
۲. شناسه‌ها (Identifiers)
۳. ثابت‌ها (Constants)
۴. رشته‌ها (Strings)
۵. نشانه‌های خاص یا جداکننده‌ها (Special Symbols or Separators)
۶. اپراتورها (Operators)

۱. کلمات کلیدی (Keywords):

Keywordها کلمات رزروشده‌ی یک زبان برنامه‌نویسی هستند. استاندارد C89 دارای 32 کلمه کلیدی است. در استاندارد C99 به 37 و در C11 به 44 کلمهٔ کلیدی رسید. از کلمات رزروشده نمی‌توان بعنوان نام تابع، نام متغیر یا موارد مشابه آن استفاده کرد؛ زیرا با اینکار سعی می‌کنیم معنای جدیدی را برای کلمهٔ کلیدی اختصاص دهیم، که مجاز به این کار نیستیم.

C (C89) language supports 32 keywords:

autodoubleintstruct
breakelselongswitch
caseenumregistertypedef
charexternreturnunion
constfloatshortunsigned
continueforsignedvoid
defaultgotosizeofvolatile
doifstaticwhile

C99 reserved 5 more words (37 keywords):

_Bool_Complex_Imaginaryinline
restrict

C11 reserved 7 more words (44 keywords):

_Alignas_Alignof_Atomic_Generic
_Noreturn_Static_assert_Thread_local

کلمات کلیدی‌ای که با زیرخط (_) شروع می‌شوند، جهت راحتی برای آن‌ها ماکروهایی تعریف شده که به آن Convenience Macro می‌گویند.

Keyword:Used as:Defined in:
_Alignasalignasstdalign.h
_Alignofalignofstdalign.h
_Atomicatomic_bool, atomic_int, …stdatomic.h
_Boolboolstdbool.h
_Complexcomplexcomplex.h
_Generic(no macro)
_Imaginaryimaginarycomplex.h
_Noreturnnoreturnstdnoreturn.h
_Static_assertstatic_assertassert.h
_Thread_localthread_localthreads.h

توکن‌های زیر توسط پیش‌پردازنده شناسایی می‌شوند:

ififdefinclude
elififndefline
elsedefineerror
endifundefpragma
defined

۲. شناسه‌ها (Identifiers):

شناسه‌ها به عنوان کلمات عمومی برای نامگذاری متغیرها، توابع و آرایه‌ها استفاده می‌شود. این‌ها اسامی تعریف‌شده توسط کاربر هستند که شامل حروف، ارقام و یا زیرخط (_) هستند. نام شناسه‌ها نمی‌تواند همنام با کلمات کلیدی باشد. در واقع شما نمی‌توانید از کلمات کلیدی به عنوان شناسه استفاده کنید؛ و آن‌ها برای استفادهٔ ویژهٔ دیگری رزرو شده‌اند.

نکات مهم در تعریف شناسه‌ها:
۱. شناسه‌ها باید با حروف انگلیسی و یا زیرخط (_) شروع شوند. شروع با اعداد مجاز نیست.
۲. نام شناسه‌ها باید شامل حروف، اعداد و زیرخط (_) باشند و مابقی کاراکترها مجاز نیستند.
۳. نام شناسه نباید همنام با یک keyword باشد.
۴. نباید در آن white space وجود داشته باشد.

اولین نام شناسه در برنامه، نقطه شروع آن یعنی کلمه main است.

۳. ثابت‌ها (Constants):

ثابت‌ها نیز مانند متغیرها هستند با این تفاوت که بعد از تعریف آن، نمی‌توان مقدار آن را تغییر داد. ثابت‌ها به مقادیر ثابت اشاره می‌کنند.

const int a = 39;
const int *b = &a;
const int *const c = &a;

۴. رشته‌ها (Strings):

رشته‌ها در واقع آرایه‌ای از کاراکترها هستند که با کاراکتر ‘0\’ خاتمه پیدا می‌کنند. رشته‌ها درون Double Quotes (“”) محصور می‌شوند، درحالی که کاراکترها درون Single Quotes (”) محصور می‌شوند.

۵. نشانه‌های خاص یا جداکننده‌ها (Special Symbols or Separators):

این نمادها معنای خاصی دارند و نمی‌توان از آن برای اهداف دیگری استفاده کرد:

۱. [] Brackets: از براکت‌های (کروشه) باز و بسته به عنوان مرجع المان (عنصر) آرایه استفاده می‌شود.
۲. () Parentheses: پرانتزها (کمانک) اشاره به فراخوانی تابع‌ها و پارامترهای تابع می‌کنند.
۳. {} Braces: بریس‌های (آکولاد) باز و بسته، علامتی از شروع و پایان یک بلاک کد می‌باشد که بیشتر از یک عبارت (Statement) اجرایی دارد.
۴. (,) Comma: کاما (ویرگول) برای جدا کردن بیش از یک عبارت مانند جدا کردن پارامترها در فراخوانی توابع استفاده می‌شود.
۵. (;) Semicolon: سمی‌کولون (نقطه‌ویرگول) یک خاتمه‌دهندهٔ دستورات در زبان C است و همچنین به تجزیه‌کننده کمک کند تا بفهمد که جمله (Statement) در کجا به پایان می‌رسد. آنچه بعد از آن می‌آید یک عبارت جدید است.
۶. (*) Asterisk: جهت کار با متغیر اشاره‌گر (Pointer Variable) استفاده می‌شود.
۷. (=) Assignment Operator: برای مقداردهی مورد استفاده قرار می‌گیرد.
۸. (#) Pre Processor: به خطوطی که با علامت هش (hash sign) (#) شروع می‌شوند، پیش‌پردازنده می‌گویند. این خطوط دستورات برنامه نیستند و دستورالعمل پیش‌پردازنده هستند، که به‌طور خودکار توسط مترجم (Compiler) برای تغییر برنامه شما قبل از ترجمه (Compilation) مورد استفاده قرار می‌گیرد.

۶. اپراتورها (Operators):

عملگرها (Operator) نمادهایی هستند که وقتی روی متغیرها اعمال می‌شوند، عملیاتی را تحریک می‌کنند. داده‌هایی که عملگرها براساس آن‌ها عمل می‌کنند، عملوند (Operand) نامیده می‌شوند. بسته به تعداد عملوندهایی که اپراتور بر اساس آن عمل می‌کند، می‌توان عملگرها را به صورت زیر دسته‌بندی کرد:

۱. Unary Operators: به عملگرهایی گفته می‌شود که برای عمل خود تنها به یک عملوند نیاز دارند. مانند عملگرهای ++ (Increment Operator)، -‌- (Decrement Operator) و sizeof

۲. Binary Operators: به عملگرهایی گفته می‌شود که برای عمل خود به دو عملوند نیاز دارند. مانند اپراتورهای محاسبه‌ای (Arithmetic Operators)، اپراتورهای رابطه‌ای (Relational Operators)، اپراتورهای منطقی (Logical Operators)، اپراتورهای انتسابی (Assignment Operators) و اپراتورهای بیتی (Bitwise Operators)

۳. Ternary Operators: به عملگرهایی گفته می‌شود که برای عمل خود به سه عملوند نیاز دارند. مانند اپراتور شرطی (Conditional Operator) (: ?)

C Operators:

Arithmetic: +, -, *, /, %
Assignment: =
Augmented Assignment: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
Bitwise Logic: ~, &, |, ^
Bitwise Shifts: <<, >>
Boolean Logic: !, &&, ||
Conditional Evaluation: ? :
Equality Testing: ==, !=
Calling Functions: ( )
Increment and Decrement: ++, —
Member Selection: ., ->
Data Size: sizeof
Order Relations: <, <=, >, >=
Reference and Dereference: &, *, [ ]
Sequencing: ,
Subexpression Grouping: ( )
Type Conversion: (typename)