知識ベース

跳躍(構文)

コンピューター言語の設計では、 stroppingは、文字列にキーワードなどの特殊なプロパティ、または特定のタイプの変数またはストレージの場所があることを明示的にマークし、通常の名前とは異なる名前空間(「識別子」)に居住する方法です、衝突を避けるため。 Stroppingはほとんどの現代言語では使用されていません。代わりに、キーワードは予約語であり、識別子として使用できません。 Stroppingでは、同じ文字列をキーワードと識別子の両方として使用でき、その場合の解析が簡単になります。たとえば、キーワードifと衝突せずにifという名前の変数を許可します。

跳躍は主に1960年代のALGOLおよび関連言語に関連しています。現代的な使用方法はいくつかありますが、表面的に似ている他の同様の手法と混同されやすくなっています。

歴史

跳躍の方法と「跳躍」という用語は、1960年代のALGOLの開発で発生し、ハードウェア言語では直接表現できなかった出版言語で見られる活版印刷の区別(太字と下線)を表すために使用されました。タイプライターには太字を使用できますが、パンチカードでのエンコードには太字はありませんでした。 ALGOL 60の一部の実装では、キーワードifを表す 'if'などの太字を示すためにテキストの周りにアポストロフィを使用したため、 "アポストロフィ"からALGOL 60で用語 "ストローピング"が生じました。ストローピングはALGOL 68でも重要です。ALGOL68では、「ストローピングレジーム」として知られる複数のストローピング方法が使用されます。 ALGOL 60の元の一致するアポストロフィは広く使用されず、.IFまたはIFのように先頭のピリオドまたは大文字がより一般的であり、「ストッピング」という用語がこれらすべてに適用されました。

構文

ストローピングのさまざまな構文が使用されています。

  • Algol 60は一般に、単語の周りの単一引用符の規則のみを使用し、一般にアポストロフィとして、「stropping」という名前(「BEGIN」または「BEGIN」など)を使用します。
  • 一部の実装では、Algol 68は、単一引用符 'を前に付けた文字シーケンスをキーワードとして扱います(たとえば、' BEGIN)

実際、1つの言語内で複数のストローピング規則が使用されている場合がよくありました。たとえば、ALGOL 68では、コンパイラ規則(ALGOLの用語では「プラグマット」)、つまりPOINT、UPPER、QUOTE、またはRESによって、選択規則を選択できます。

  • .FORのように、6ビットのPOINT(小文字に十分な文字がありません)– FORTRAN 77でも同様の規則が使用され、LOGICALキーワードは.EQに変更されます。など(以下を参照)
  • FORのような7ビットのUPPER –通常の識別子に小文字を使用
  • 「for」などのALGOL 60のような見積もり
  • 現在の言語で使用されているRES予約語– forは予約されており、通常の識別子では使用できません

さまざまなルール体系は、文字の字句の仕様ですが、場合によっては単純な解釈があります:単一のアポストロフィとドットの体系では、最初の文字はエスケープ文字として機能し、一致したアポストロフィの体制ではアポストロフィは次のように機能します文字列リテラルのような区切り文字。

他の例:

  • Atlas Autocodeには3つの選択肢がありました。フレキソライターキーボードでバックスペースと上打ちを使用してキーワードに下線を付けることができます。その場合、すべての変数は小文字でなければなりませんでした)。
  • ALGOL 68RSプログラムでは、1つの言語プロセッサ内であっても、いくつかのストローピングバリアントを使用できます。
  • Edinburgh IMPはAtlas Autocode%percent%symbolプレフィックス規則を継承しましたが、他のストローピングオプションは継承しませんでした

さまざまなALGOL 68スタイルの例

先行するprpragmatの省略 )ディレクティブに注意してください。これはそれ自体がPOINTまたはquoteスタイルで省略され、コメントの¢(「2¢」から)です。詳細については、ALGOL 68:pr&co:Pragmats and Commentsを参照してください。

Algol68 "strict"
通常公開されるように
引用ストロップ
(wikitextなど)
7ビット文字コードコンパイラの場合 6ビット文字コードコンパイラの場合
¢下線または太字書体¢ mode xint = int ; xint sum sq:= 0;私のために合計平方≠70×70は、合計を行う 一方、SQ +:=私は2 ODを
'pr' quote 'pr' 'mode' 'xint' = 'int'; 'xint' sum sq:= 0; 'for' i 'while' sum sq≠70×70 'do' sum sq +:= i↑2 'od'
.PR UPPER .PR MODE XINT = INT; XINT sum sq:= 0;合計sq / = 70 * 70 DO合計sq +:= i ** 2 ODの場合
.PRポイント.PR .MODE .XINT = .INT; .XINT SUM SQ:= 0; .FOR I .WHILE SUM SQ .NE 70 * 70 .DO SUM SQ .PLUSAB I .UP 2 .OD

他の言語

さまざまな理由から、Fortran 77には次の「論理」値と演算子があります。TRUE。、。FALSE。、。EQ。、。NE。、。LT。、。LE。、。GT。、。GE。、。EQV。、 .NEQV。、。OR。、。AND。、。NOT。

.AND。、。OR。および.XOR。また、4DOS、4OS2、4NT / Take CommandなどのJP Softwareのコマンドラインプロセッサで実行されるバッチファイル内のIFおよびIFFステートメントの組み合わせテストでも使用されます。

現代の使用

最近のほとんどのコンピューター言語では、2つの注目すべき例外を除き、ストロッピングを使用していません。

Microsoftの.NET共通言語インフラストラクチャ(CLI)で多くの言語を使用するには、呼び出し言語のキーワードである可能性のある異なる言語の変数を使用する方法が必要です。これは、C#の@などのプレフィックスや、Visual Basic.NETの識別子を角かっこで囲むことによって行われることがあります。

2番目の主要な例は、構造化照会言語の多くの実装です。これらの言語では、予約語を語彙的に区切ることにより、列、テーブル、または変数名として使用できます。この規格では、予約語を二重引用符で囲むことを指定していますが、実際のメカニズムは実装によって異なります。たとえば、MySQLでは、予約語をバッククォートで囲むことで他のコンテキストで使用でき、Microsoft SQL Serverでは角括弧を使用します。

Stroppingは、Nimプログラミング言語でも使用できます。 Nimでは、予約語をバッククォートで囲むことにより識別子として使用できます。

他にも、もっと小さな例があります。たとえば、Web IDLは、先頭のアンダースコア_を使用して、予約語と衝突する識別子を破棄します。識別子の値は、命名規則ではなく、この先頭のアンダースコアを取り除き、この破棄を行います。

コンパイラーによるアンストロッピング

コンパイラのフロントエンドでは、最初に行の再構築フェーズでアンストロッピングが発生し、空白も削除されました。その後、スキャナーレス解析が行われました(トークン化なし)。これは、特にALGOLの1960年代の標準でした。現代の使用では、一般に、語彙解析の一部としてunstroppingが行われます。これは、レクサーをスキャナーとエバリュエーターの2つのフェーズに区別する場合に明らかです。スキャナーは、ストロープされたシーケンスを正しいカテゴリーに分類し、エバリュエーターが値を計算するときにアンストロープします。たとえば、予約語との衝突を避けるために識別子を破棄するために最初のアンダースコアが使用される言語では、シーケンス_ifがスキャナーによって識別子として(予約語としてではなく)分類され、評価者はこれを与えるでしょう値if。トークンのタイプと値として(Identifier、if)を生成します。

同様のテクニック

一般に、異なる処理を示すために識別子に接頭辞または接尾辞を付ける同様の手法が多数存在しますが、セマンティクスはさまざまです。厳密に言えば、stroppingは異なる名前空間の同じ名前(値)の異なる表現で構成され、トークン化の段階で発生します。たとえば、一致したアポストロフィストローピングを持つALGOL 60では、「if」は(Keyword、if)としてトークン化され、ifは(Identifier、if)としてトークン化されます-異なるトークンクラスで同じ値。

キーワードに大文字を使用すると、字句解析および構文解析の文法を書くための規則として使用されます。トークンクラスIFとして予約語ifをトークン化し、IF式THENステートメントELSEステートメントでif-then-else句を表します用語はキーワードであり、大文字の用語はプロダクションルールの非終端記号です(終端記号は、整数リテラルの場合、識別子や整数などの小文字の用語で示されます)。

命名規則

最も大まかに言えば、if_や_thenのように、アンダースコアを接頭辞または接尾辞として付ける衝突を避けるために、命名規則を使用できます。多くの場合、先頭のアンダースコアは、オブジェクト指向プログラミングのプライベートメンバーを示すために使用されます。

これらの名前はコンパイラーによって解釈され、何らかの効果がありますが、これは一般にトークン化フェーズではなくセマンティック分析フェーズで行われます。たとえば、Pythonでは、単一の先行アンダースコアは弱いプライベートインジケーターであり、モジュールのインポート時にインポートされる識別子に影響を与えますが、クラス属性の二重先行アンダースコア(および後続アンダースコアは1つのみ)は名前マングリングを呼び出します。

予約語

現代の言語は一般に、キーワードを識別子と区別するために、ストローピングではなく予約語を使用します(たとえば、予約されている場合)-また、キーワードの識別子の構文クラスを予約して、ストローピング体制として解釈できる表現を生成しますが、代わりにセマンティクスを持っています予約語の。

これは、アンダースコアで始まる識別子が予約されているCで最も注目に値しますが、どのスコープでどの識別子が予約されているか、および先頭の二重アンダースコアはすべての使用のために予約されています。同様に、C ++では、二重アンダースコアを含む識別子はすべての使用のために予約されていますが、アンダースコアで始まる識別子はグローバルスペースで予約されています。したがって、予約語__fooを使用して新しいキーワードfooを追加できます。これは表面的にはストローピングに似ていますが、セマンティクスは異なります。予約語として、文字列__fooは、共通識別子名前空間の識別子__fooを表します。 stropping(キーワードの前に__を付ける)では、文字列__fooは別のキーワード名前空間のキーワードfooを表します。したがって、予約語を使用すると、__ fooとfooのトークンは(identifier、__foo)と(identifier、foo)–同じカテゴリーの異なる値です– __fooとfooのトークンを破棄すると、(keyword、foo)と(identifier、 foo)–異なるカテゴリの同じ値。これらは、プログラマーと同じ方法で名前空間の衝突の同じ問題を解決しますが、形式的な文法と実装の点では異なります。

名前のマングリング

名前マングリングは、識別子の名前を変更することで名前の衝突にも対処しますが、これはコンパイルのかなり後の方で、トークン化中ではなく、意味解析中に行います。これは、衝突を回避し、名前自体に必要なセマンティック情報を含めるために、主にリンカーが使用するスコープおよびタイプ情報を含む名前の作成で構成されます。これらの場合、元の識別子は同一かもしれませんが、関数foo(int x)とfoo(char x)のように、コンテキストは異なります。どちらの場合も同じ識別子fooを持ちますが、署名は異なります。これらの名前は、たとえば、タイプ情報を含めるためにfoo_iおよびfoo_cにマングルされます。

印章

構文的には似ているが意味的に異なる現象はシギルであり、代わりに変数のプロパティを示します。これらは、Perl、Ruby、および変数/定数の特性を識別する他のさまざまな言語で一般的です。Perlは変数のタイプを指定し、Rubyは変数を定数と区別し、スコープを示します。これは変数のセマンティクスに影響することに注意してください。識別子またはキーワードであるかどうかの構文には影響しません。

人間の言語の類似点

Stroppingはコンピュータープログラミング言語で使用され、コンパイラー(より厳密にはパーサー)の作業を容易にします。つまり、20世紀の初期のコンピューティングで利用可能な比較的小さくて遅いコンピューターの能力の範囲内です。ただし、同様の手法は、人々の読解を助けるためにも一般的に使用されています。以下に例を示します。

  • stroppingを定義することはページの目的であるため、このページの先頭にstroppingの最初の言及など、重要な単語を太字で配置します。
  • 新しい単語がテキストで最初に導入されたときに、新しい単語を斜体でフォーマットします。これは、発明された植物、食物、生き物を紹介するときに、SFやファンタジーでよく使用されます。なじみのない外国語を説明する際の旅行記や歴史的文書。等々。また、おそらくドイツ語の単語にゴシックフォントを使用するなど、問題の言語に関連付けられている特別なフォントを使用します。
  • 別の言語、通常はラテン語またはギリシャ語を使用して技術用語を示します。これは予約語の使用に似ていますが、通常は読みやすくするために斜体のテキストと組み合わせます。例えば:
    • 植物や動物の典型的な二項命名法または「ラテン語名」は、 Erithacus rubeculaヨーロッパ産のツグミの特別な技術名であることを読者が理解するのに役立ちます。
    • 短いラテン語のフレーズが、 hacoas corpussub judiceloco parentisなど、多数の法律および先例を指す多くの法的用語。
    • QEDアプリオリその逆などの論理および数学用語…
  • 書かれた日本語では、同じ音節のセットを表す2つの異なるひらがなとカタカナが、それぞれ、発音どおりに綴られた日本語の単語またはインポートされた外国語を区別するために使用されます。カタカナは、英語の斜体のように強調にも使用されます。