形式言語ブロック
作者
- アイデア、文字列分析方法、一般的なアーキテクチャとアーキテクチャの実装 - Oleg Sychev
- 組み込み言語の実装 - Dmitry Mamontov
説明
形式的言語ブロックの目的は、形式的言語を管理するためのAPIを提供することです。これは、規則に制約された一連の文字列を定義する、よく知られている数学形式です。
現在のステータス
特徴 | 説明 | 状態 |
---|---|---|
走査 | 文字列をトークンに分割します。これは、さらなる分析に役立ちます。 | 実装済み |
構文解析 | 文字列から抽象構文木を構築し、文字列を詳細に分析したり評価を実行することさえ可能にします。 | 未実装 |
形式言語の管理 | 現在、C、C ++、printf形式の文字列スキャナが実装されています。英語用の単純な字句解析も実装されています。ユーザー定義のレクサーとパーサーは、次のリリースで実装される予定です。 | 部分的に実装 |
現在の言語実装状況
言語 | 走査 | 構文解析 |
---|---|---|
簡単な英語 | 実装済み | 未実装 |
C | 実装済み | 未実装 |
C ++ | 実装済み | 部分的に実装 |
printfフォーマット文字列 | 実装済み | 未実装 |
インストール
Formal languages blockを機能させるには、いくつかの追加コンポーネントが必要です。質問が機能するためには、それらすべてをインストールする必要があります。
質問タイプPOASquestion( qtype_poasquestion )をインストールする必要があります。これは抽象的です(つまり、実際の質問としては表示されません)が、Unicode文字列のスキャンおよび処理に役立つコードが含まれています。
ユーザーインターフェース
正式な言語ブロックをコースに追加した後、教師は目のアイコンをクリックして言語の可視性を管理できます。可視性が無効になっている淡色表示された言語は、CorrectWritingやその他の正式な言語ブロックのAPIを使用するプラグインには表示されません。
言語の可視性はサイト設定から継承できることに注意してください。そのため、現在のコースにサイト設定が適用されている場合、言語名の前に「(Site)」というラベルが表示され、「(Course)」というラベルはコースレベルで適用されていることを示します。サイトの言語の表示設定とコースレベルが等しい場合、このコースの言語はサイトレベルの表示設定に設定されているとみなされ、コースレベルの表示設定が変更されると変更されます。サイトの可視性がコースと異なる場合は、独立していると見なされ、サイトレベルの変更に伴って変化することはありません。
管理者はまた、管理者メニューにあるグローバル設定を使用して、正式な言語のグローバルな可視性を編集することができます(詳細は写真を参照)。
管理ページの中心部分は、以下のようになります。
サイトレベルの言語の表示/非表示を変更すると、adminはこの変更の影響を受けるコースのリストを表示します。
開発者向けAPI
メインブロッククラスblock_formal_langsは、私たちのAPIを使用して文字列スキャンを実行したいという、2つの単純な関数を提供します(それがどのように機能するかについては、CorrectWriting質問型の例を参照)。
- block_formal_langs :: available_langs - 現在の文脈で使用できる言語の配列を返す現在のコンテキストIDを受け取ります。
- block_formal_langs :: lang_object - 言語オブジェクトを言語IDで返します
言語オブジェクトを取得したら、 create_from_stringまたはcreate_from_dbを使用して、データベース内の説明を参照せずに文字列をスキャンしたり、それらを参照したりできます。これは、語彙素を扱うために使用できる特別なオブジェクトを返します。
$ aがcreate_from_stringまたはcreate_from_dbによって返されるオブジェクトの場合、スキャンされた文字列を取得するには$ a-> string、スキャンされた語彙素の配列を返すには$ a-> stream-> token、取得するには$ a-> stream-> errorsを使用できます。エラーの配列
スキャンされた語彙素を使用して、特別なタイプの語彙素を取得するためにtype()メソッドを使用するか、または語彙素のセマンティック値を取得するためにvalue()を使用できます。
例:
1.以下のコードを使用して、システムコンテキストで使用可能なすべての言語の名前とIDを印刷できます。
$ langs = block_formal_langs :: available_langs ( context_system :: instance ( ) - > id ) ; foreach ( $ は $ id => $ name として langs ) { echo 'id:' 。 $ ID です。 '名前:' 。 $名 。 PHP_EOL ; }
2.以下のコードを使用して、すべてのトークンのテキストを印刷し、C言語レクサーで文字列をスキャンします。
$ lang = block_formal_langs :: lang_object ( 2 ) ; //ほとんどのデータベースのCプログラミング言語のIDは2になります $ string = $ lang - > create_from_string ( 'int a;' ) ; $ tokens = $ string - > stream - > tokens ; foreach ( $ token を $ token として ) { エコー $トークン - > 値 ()。 PHP_EOL ; }