unified

ハイパーオブジェクトのパーズとアンパーズ

ハイパーオブジェクトは別にリンクを含まないスレートオブジェクトでもよい。 ハイパーオブジェクトの型情報にフォーマットがあれば、フォーマットは文法を規定する。 文法によりパージングができる。 パージングの結果はハイパーコレクション、つまりハイパ…

ブリットの課題: unist, JSON-LD

unistのツリー構造とJSON-LDを統合できないだろうか。

シェブロテインを復習

過去の記事をまとめてメモとする。ザッと読んで思い出すには便利だと思う。 シェブロテインのレコーディングフェーズとGAST - (新) 檜山正幸のキマイラ飼育記 メモ編 GAST〈ガスト〉はグラマーASTのこと パーザークラスのコンストラクタが呼ばれると自己分析…

シェブロテインのレコーディングフェーズとGAST

シェブロテインは、ユーザーのパーザークラスのコンストラクタ内での自己分析実行関数呼び出しにより、GAST〈Grammar AST | ガスト〉を作る。ガストを作るときに、パーザー関数を呼び出す。この作業工程をレコーディングフェーズと呼ぶ。レコーディングフェ…

シェブロテインの自己分析実行関数

peformSeflAnalysys はパーザーの引数なしメソッド this.peformSeflAnalysys() 以外に、 オブジェクトを引数に取るスタティックメソッド shev.Parser.peformSeflAnalysys(obj) もあるようだ。いずれにしても、ユーザー・パーザークラスのコンストラクタで呼…

シェブロテインのパーザー関数

パーザークラスの宣言から RULEメソッドのプロファイルを見る。 /** * A Parser that outputs a Concrete Syntax Tree. * See: * - https://chevrotain.io/docs/tutorial/step3_adding_actions_root.html#alternatives * - https://chevrotain.io/docs/guide…

importの書き方

node.jsのモジュールサーチは評判が悪いようだが、確かに、どこからモジュールを持ってくるのかは分かりにくい。次のようにしよう。 nodeのコアモジュールのときは、node: スキームをつける。import fs from 'node:fs/promises'; インストールしたNPMパッケ…

シェブロテインで使っている型

https://dev.to/nathant/how-i-built-my-own-simplified-react-with-chevrotain-typescript-webpack-3ja6 : const Let: chevrotain.ITokenConfig = createToken({ name: "Let", pattern: /let/, longer_alt: Identifier }); ↑型の指定が間違っている。戻り…

シェブロテインを使ったパーザー

Stardog で使っているパーザーのインターフェイス https://github.com/stardog-union/millan/blob/master/src/helpers/chevrotain/types.ts : import { IToken, IRecognitionException, CstNode, TokenType, IRecognizerContext, } from 'chevrotain'; expo…

シェブロテインのCST構造

CstElement export declare type CstElement = IToken | CstNode IToken /** * Things to note: * - The offset range is inclusive to exclusive. * * - A lineTerminator as the last character does not effect the Token's line numbering. * In other w…

シェブロテインの学習

https://github.com/witheve/Eve/blob/master/src/parser/parser.ts import * as chev from "chevrotain"; var {Lexer, tokenMatcher} = chev; export var Token = chev.Token; /* .... */ // Comments export class CommentLine extends Token { static PAT…

シェブロテインの内部規則のダンプ

const productions: Record<string, Rule> = parser.getGAstProductions(); console.dir(productions); GAstが意味不明だが、Generated AST かな? ともかく、GAstProductions が内部的に構築されればバージングが出来る状態になる。</string,>

依存方針、特にunified/シェブロテイン

まず、全体的にnpmエコシステムとunifiedエコシステムにはどっぷりと完全に依存する。npm, unifiedと一蓮托生。npmパッケージング・フォーマットとか配布〈ディストリビューション〉プラットフォームの仕様・機能・作法に従うし、べったり依存の方式を採用す…

reline 雑メモ

コピペしただけでグチャグチャだが、後で整理する。 ディレクトリ構成 ./node_modeules/ の下に reline/ reline-cli/ reline-parse/ reline-stringify/ reline-remove-trailling-spaces/ reline-add-line-number/ reline-to-html-pre/ (rehype と hastscrip…

ストリームとstdio

https://github.com/retextjs/retext/tree/main/packages/retext-english より、コメントは檜山。 import {unified} from 'unified' import {stream} from 'unified-stream' import retextEnglish from 'retext-english' import retextStringify from 'retex…

ローカル実験用パッケージの作り方

./node_modules/ の直下にパッケージ名ディレクトリを作る。e.g. ./node_modules/my-hello-pkg/ パッケージ名ディレクトリの直下に package.json を書く。 パッケージ名ディレクトリの直下に index.js と index.d.ts を置く。tsc --declaration index.ts で…

プラグイン方式の整理

パフォーマーの起動〈invocation〉 関数呼び出し(プロファイルが必要) オブジェクトのメソッド呼び出し(メソッド名+プロファイルが必要) パフォーマーの失敗結果〈failure result〉 エラー戻り値(規約が必要) 例外(モラルが必要; Error型データを投…

unifiedプラグインアーキテクチャの再定式化

まず、ソフトウェアコンポネントを、 プラグイン ドライバー に分ける。プラグインの種類を、 パーザー トランスフォーマー コンパイラ〈シリアライザー | ストリンギファイア〉 の3種に分ける。プラグインは、 アタッチャー パフォーマー に2つの部分からな…

unifiedパーザープラグインの事例 2

https://github.com/redotjs/redot/blob/main/packages/redot-parse/redot-parse.js "use strict"; // generated by dot.pegjs var parser = require("./dot.js"); function parse(doc, file) { try { return parser.parse(file.contents || doc); } catch (…

unifiedストリンギファイアプラグインの事例

https://github.com/retextjs/retext/blob/main/packages/retext-stringify/lib/index.js /** * @typedef {import('nlcst').Root} Root */ import {toString} from 'nlcst-to-string' /** @type {import('unified').Plugin<void[], Root, string>} */ export default function rete</void[],>…

unified外部連結フレームワーク

unifiedドライバー(主にunified)と各種プラグインプロセッサ達が作る内部世界があって、それと外部世界を繋ぐグルーになるのが外部連結フレームワーク(と呼んでおく)。まず、unifiedエンジン(unifiedエンジン - (新) 檜山正幸のキマイラ飼育記 メモ編)…

unifiedパーザープラグインの事例

ドライバー内蔵ではないプラグインパーザーの例: https://github.com/retextjs/retext/blob/main/packages/retext-english/lib/index.jsまず、使っているパッケージは https://www.npmjs.com/package/unherit と https://www.npmjs.com/package/parse-engli…

unified vfile

プロファイル: new VFile(arg? : (Options | string | buffer | VFile) ) : VFile 引数: arg: Options → 正規の引数 arg: (string | Buffer ) → arg := {value: arg} と再設定 arg:VFile → シャローコピーを返す。 arg: undefined → おそらくデフォルトのV…

unifiedエンジン

https://m-hiyama-memo.hatenablog.com/entry/2022/04/11/145718 の続き。https://github.com/unifiedjs/unified-engine より: import {engine} from 'unified-engine' import {remark} from 'remark' engine( { processor: remark, files: ['.'], extensio…

unifiedの体系

unifiedの分かりにくさ - (新) 檜山正幸のキマイラ飼育記 メモ編 の続き。unifiedフレームワークを整理する。 まず、テキストフォーマット=テキスト型=文字列型の部分集合型 がある。その例は、MD, HTML, JSON, TEXT など。 テキストフォーマットはファイ…

unifiedの利用

Tenjinの方針は“ありもの利用”だから、unifiedは使う。 いわゆる“unified plugin”はすべてそのまま利用したい。 remark-cli のようにコマンドラインから使いたい。 したがって、remark-cli と同じ作りにする必要がある。 設定ファイルもunifiedと共用できる…

unifiedのプラグイン事例と曖昧性

https://github.com/remarkjs/remark から: import {visit} from 'unist-util-visit' /** @type {import('unified').Plugin<[], import('mdast').Root>} */ function myRemarkPluginToIncreaseHeadings() { return (tree) => { visit(tree, (node) => { if …

unifiedの分かりにくさ

unifiedの分かりにくさは、プロセッサ〈プラグイン〉とドライバーの区別がハッキリせず、それらの役割が述べられてないことだろう。 プロセッサは何らかの文書処理をする。 プロセッサの入力と出力は前もって決められた〈仕様化〉された構造(mdast, hastな…

unifiedドライバー

プラグインをドライブするものはドライバーと呼ぼう。unifiedはドライバーだが、remarkやretextもドライバーになっている。ドライバーの使い方は、 driver() .use(pluginA) .use(pluginB, pluginPramForB) .freeze() .process(input) .then(writerCallback);…

unifiedの用語

だいたいは分かるが念の為: AST : 抽象構文木、構造のみ CST : 具象構文木、テキストの情報をけっこう残す unist : unifiedの構文木仕様、「ユニスト」でいいかな。 mdast : Markdown(MD)のunisit特殊化、「ムダスト」でいいかな。 haast : HTMLのun…