|
627 | 627 | \end{example} |
628 | 628 | \indextext{token!preprocessing|)} |
629 | 629 |
|
630 | | -\rSec1[lex.digraph]{Alternative tokens} |
631 | | - |
632 | | -\pnum |
633 | | -\indextext{token!alternative|(}% |
634 | | -Alternative token representations are provided for some operators and |
635 | | -punctuators. |
636 | | -\begin{footnote} |
637 | | -\indextext{digraph}% |
638 | | -These include ``digraphs'' and additional reserved words. The term |
639 | | -``digraph'' (token consisting of two characters) is not perfectly |
640 | | -descriptive, since one of the alternative \grammarterm{preprocessing-token}s is |
641 | | -\tcode{\%:\%:} and of course several primary tokens contain two |
642 | | -characters. Nonetheless, those alternative tokens that aren't lexical |
643 | | -keywords are colloquially known as ``digraphs''. |
644 | | -\end{footnote} |
645 | | - |
646 | | -\pnum |
647 | | -In all respects of the language, each alternative token behaves the |
648 | | -same, respectively, as its primary token, except for its spelling. |
649 | | -\begin{footnote} |
650 | | -Thus the ``stringized'' values\iref{cpp.stringize} of |
651 | | -\tcode{[} and \tcode{<:} will be different, maintaining the source |
652 | | -spelling, but the tokens can otherwise be freely interchanged. |
653 | | -\end{footnote} |
654 | | -The set of alternative tokens is defined in |
655 | | -\tref{lex.digraph}. |
656 | | - |
657 | | -\begin{tokentable}{Alternative tokens}{lex.digraph}{Alternative}{Primary} |
658 | | -\tcode{<\%} & \tcode{\{} & |
659 | | -\keyword{and} & \tcode{\&\&} & |
660 | | -\keyword{and_eq} & \tcode{\&=} \\ \rowsep |
661 | | -\tcode{\%>} & \tcode{\}} & |
662 | | -\keyword{bitor} & \tcode{|} & |
663 | | -\keyword{or_eq} & \tcode{|=} \\ \rowsep |
664 | | -\tcode{<:} & \tcode{[} & |
665 | | -\keyword{or} & \tcode{||} & |
666 | | -\keyword{xor_eq} & \tcode{\caret=} \\ \rowsep |
667 | | -\tcode{:>} & \tcode{]} & |
668 | | -\keyword{xor} & \tcode{\caret} & |
669 | | -\keyword{not} & \tcode{!} \\ \rowsep |
670 | | -\tcode{\%:} & \tcode{\#} & |
671 | | -\keyword{compl} & \tcode{\~} & |
672 | | -\keyword{not_eq} & \tcode{!=} \\ \rowsep |
673 | | -\tcode{\%:\%:} & \tcode{\#\#} & |
674 | | -\keyword{bitand} & \tcode{\&} & |
675 | | - & \\ |
676 | | -\end{tokentable}% |
677 | | -\indextext{token!alternative|)} |
678 | | - |
679 | | -\rSec1[lex.token]{Tokens} |
680 | | - |
681 | | -\indextext{token|(}% |
682 | | -\begin{bnf} |
683 | | -\nontermdef{token}\br |
684 | | - identifier\br |
685 | | - keyword\br |
686 | | - literal\br |
687 | | - operator-or-punctuator |
688 | | -\end{bnf} |
689 | | - |
690 | | -\pnum |
691 | | -\indextext{\idxgram{token}}% |
692 | | -There are five kinds of tokens: identifiers, keywords, literals,% |
693 | | -\begin{footnote} |
694 | | -Literals include strings and character and numeric literals. |
695 | | -\end{footnote} |
696 | | -operators, and other separators. |
697 | | -\indextext{whitespace}% |
698 | | -Blanks, horizontal and vertical tabs, newlines, formfeeds, and comments |
699 | | -(collectively, ``whitespace''), as described below, are ignored except |
700 | | -as they serve to separate tokens. |
701 | | -\begin{note} |
702 | | -Whitespace can separate otherwise adjacent identifiers, keywords, numeric |
703 | | -literals, and alternative tokens containing alphabetic characters. |
704 | | -\end{note} |
705 | | -\indextext{token|)} |
706 | | - |
707 | 630 | \rSec1[lex.header]{Header names} |
708 | 631 |
|
709 | 632 | \indextext{header!name|(}% |
|
793 | 716 | a \grammarterm{floating-point-literal} token.% |
794 | 717 | \indextext{number!preprocessing|)} |
795 | 718 |
|
| 719 | +\rSec1[lex.operators]{Operators and punctuators} |
| 720 | + |
| 721 | +\pnum |
| 722 | +\indextext{operator|(}% |
| 723 | +\indextext{punctuator|(}% |
| 724 | +The lexical representation of \Cpp{} programs includes a number of |
| 725 | +preprocessing tokens that are used in the syntax of the preprocessor or |
| 726 | +are converted into tokens for operators and punctuators: |
| 727 | + |
| 728 | +\begin{bnf} |
| 729 | +\nontermdef{preprocessing-op-or-punc}\br |
| 730 | + preprocessing-operator\br |
| 731 | + operator-or-punctuator |
| 732 | +\end{bnf} |
| 733 | + |
| 734 | +\begin{bnf} |
| 735 | +%% Ed. note: character protrusion would misalign various operators. |
| 736 | +\microtypesetup{protrusion=false}\obeyspaces |
| 737 | +\nontermdef{preprocessing-operator} \textnormal{one of}\br |
| 738 | + \terminal{\# \#\# \%: \%:\%:} |
| 739 | +\end{bnf} |
| 740 | + |
| 741 | +\begin{bnf} |
| 742 | +\microtypesetup{protrusion=false}\obeyspaces |
| 743 | +\nontermdef{operator-or-punctuator} \textnormal{one of}\br |
| 744 | + \terminal{\{ \} [ ] ( )}\br |
| 745 | + \terminal{<: :> <\% \%> ; : ...}\br |
| 746 | + \terminal{? :: . .* -> ->* \~}\br |
| 747 | + \terminal{! + - * / \% \caret{} \& |}\br |
| 748 | + \terminal{= += -= *= /= \%= \caret{}= \&= |=}\br |
| 749 | + \terminal{== != < > <= >= <=> \&\& ||}\br |
| 750 | + \terminal{<< >> <<= >>= ++ -- ,}\br |
| 751 | + \terminal{\keyword{and} \keyword{or} \keyword{xor} \keyword{not} \keyword{bitand} \keyword{bitor} \keyword{compl}}\br |
| 752 | + \terminal{\keyword{and_eq} \keyword{or_eq} \keyword{xor_eq} \keyword{not_eq}} |
| 753 | +\end{bnf} |
| 754 | + |
| 755 | +Each \grammarterm{operator-or-punctuator} is converted to a single token |
| 756 | +in translation phase 7\iref{lex.phases}.% |
| 757 | +\indextext{punctuator|)}% |
| 758 | +\indextext{operator|)} |
| 759 | + |
| 760 | +\rSec1[lex.digraph]{Alternative tokens} |
| 761 | + |
| 762 | +\pnum |
| 763 | +\indextext{token!alternative|(}% |
| 764 | +Alternative token representations are provided for some operators and |
| 765 | +punctuators. |
| 766 | +\begin{footnote} |
| 767 | +\indextext{digraph}% |
| 768 | +These include ``digraphs'' and additional reserved words. The term |
| 769 | +``digraph'' (token consisting of two characters) is not perfectly |
| 770 | +descriptive, since one of the alternative \grammarterm{preprocessing-token}s is |
| 771 | +\tcode{\%:\%:} and of course several primary tokens contain two |
| 772 | +characters. Nonetheless, those alternative tokens that aren't lexical |
| 773 | +keywords are colloquially known as ``digraphs''. |
| 774 | +\end{footnote} |
| 775 | + |
| 776 | +\pnum |
| 777 | +In all respects of the language, each alternative token behaves the |
| 778 | +same, respectively, as its primary token, except for its spelling. |
| 779 | +\begin{footnote} |
| 780 | +Thus the ``stringized'' values\iref{cpp.stringize} of |
| 781 | +\tcode{[} and \tcode{<:} will be different, maintaining the source |
| 782 | +spelling, but the tokens can otherwise be freely interchanged. |
| 783 | +\end{footnote} |
| 784 | +The set of alternative tokens is defined in |
| 785 | +\tref{lex.digraph}. |
| 786 | + |
| 787 | +\begin{tokentable}{Alternative tokens}{lex.digraph}{Alternative}{Primary} |
| 788 | +\tcode{<\%} & \tcode{\{} & |
| 789 | +\keyword{and} & \tcode{\&\&} & |
| 790 | +\keyword{and_eq} & \tcode{\&=} \\ \rowsep |
| 791 | +\tcode{\%>} & \tcode{\}} & |
| 792 | +\keyword{bitor} & \tcode{|} & |
| 793 | +\keyword{or_eq} & \tcode{|=} \\ \rowsep |
| 794 | +\tcode{<:} & \tcode{[} & |
| 795 | +\keyword{or} & \tcode{||} & |
| 796 | +\keyword{xor_eq} & \tcode{\caret=} \\ \rowsep |
| 797 | +\tcode{:>} & \tcode{]} & |
| 798 | +\keyword{xor} & \tcode{\caret} & |
| 799 | +\keyword{not} & \tcode{!} \\ \rowsep |
| 800 | +\tcode{\%:} & \tcode{\#} & |
| 801 | +\keyword{compl} & \tcode{\~} & |
| 802 | +\keyword{not_eq} & \tcode{!=} \\ \rowsep |
| 803 | +\tcode{\%:\%:} & \tcode{\#\#} & |
| 804 | +\keyword{bitand} & \tcode{\&} & |
| 805 | + & \\ |
| 806 | +\end{tokentable}% |
| 807 | +\indextext{token!alternative|)} |
| 808 | + |
| 809 | +\rSec1[lex.token]{Tokens} |
| 810 | + |
| 811 | +\indextext{token|(}% |
| 812 | +\begin{bnf} |
| 813 | +\nontermdef{token}\br |
| 814 | + identifier\br |
| 815 | + keyword\br |
| 816 | + literal\br |
| 817 | + operator-or-punctuator |
| 818 | +\end{bnf} |
| 819 | + |
| 820 | +\pnum |
| 821 | +\indextext{\idxgram{token}}% |
| 822 | +There are five kinds of tokens: identifiers, keywords, literals,% |
| 823 | +\begin{footnote} |
| 824 | +Literals include strings and character and numeric literals. |
| 825 | +\end{footnote} |
| 826 | +operators, and other separators. |
| 827 | +\indextext{whitespace}% |
| 828 | +Blanks, horizontal and vertical tabs, newlines, formfeeds, and comments |
| 829 | +(collectively, ``whitespace''), as described below, are ignored except |
| 830 | +as they serve to separate tokens. |
| 831 | +\begin{note} |
| 832 | +Whitespace can separate otherwise adjacent identifiers, keywords, numeric |
| 833 | +literals, and alternative tokens containing alphabetic characters. |
| 834 | +\end{note} |
| 835 | +\indextext{token|)} |
| 836 | + |
796 | 837 | \rSec1[lex.name]{Identifiers} |
797 | 838 |
|
798 | 839 | \indextext{identifier|(}% |
|
1038 | 1079 | \indextext{keyword|)}% |
1039 | 1080 |
|
1040 | 1081 |
|
1041 | | -\rSec1[lex.operators]{Operators and punctuators} |
1042 | | - |
1043 | | -\pnum |
1044 | | -\indextext{operator|(}% |
1045 | | -\indextext{punctuator|(}% |
1046 | | -The lexical representation of \Cpp{} programs includes a number of |
1047 | | -preprocessing tokens that are used in the syntax of the preprocessor or |
1048 | | -are converted into tokens for operators and punctuators: |
1049 | | - |
1050 | | -\begin{bnf} |
1051 | | -\nontermdef{preprocessing-op-or-punc}\br |
1052 | | - preprocessing-operator\br |
1053 | | - operator-or-punctuator |
1054 | | -\end{bnf} |
1055 | | - |
1056 | | -\begin{bnf} |
1057 | | -%% Ed. note: character protrusion would misalign various operators. |
1058 | | -\microtypesetup{protrusion=false}\obeyspaces |
1059 | | -\nontermdef{preprocessing-operator} \textnormal{one of}\br |
1060 | | - \terminal{\# \#\# \%: \%:\%:} |
1061 | | -\end{bnf} |
1062 | | - |
1063 | | -\begin{bnf} |
1064 | | -\microtypesetup{protrusion=false}\obeyspaces |
1065 | | -\nontermdef{operator-or-punctuator} \textnormal{one of}\br |
1066 | | - \terminal{\{ \} [ ] ( )}\br |
1067 | | - \terminal{<: :> <\% \%> ; : ...}\br |
1068 | | - \terminal{? :: . .* -> ->* \~}\br |
1069 | | - \terminal{! + - * / \% \caret{} \& |}\br |
1070 | | - \terminal{= += -= *= /= \%= \caret{}= \&= |=}\br |
1071 | | - \terminal{== != < > <= >= <=> \&\& ||}\br |
1072 | | - \terminal{<< >> <<= >>= ++ -- ,}\br |
1073 | | - \terminal{\keyword{and} \keyword{or} \keyword{xor} \keyword{not} \keyword{bitand} \keyword{bitor} \keyword{compl}}\br |
1074 | | - \terminal{\keyword{and_eq} \keyword{or_eq} \keyword{xor_eq} \keyword{not_eq}} |
1075 | | -\end{bnf} |
1076 | | - |
1077 | | -Each \grammarterm{operator-or-punctuator} is converted to a single token |
1078 | | -in translation phase 7\iref{lex.phases}.% |
1079 | | -\indextext{punctuator|)}% |
1080 | | -\indextext{operator|)} |
1081 | | - |
1082 | 1082 | \rSec1[lex.literal]{Literals}% |
1083 | 1083 | \indextext{literal|(} |
1084 | 1084 |
|
|
0 commit comments