You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
Ruby 3.3リリース! 新機能解説 Prism:エラートレラントな、まったく新しいRubyパーサ Prismは、Ruby 3.3.0にバンドルされた新しいライブラリで、プログラミング言語Rubyの新しいパーサであるPrismパーサのバインディングです。Prismはエラートレラント、移植性、メンテナンス性、高速性、効率性を考慮して設計されています。この記事では、Prismの歴史、設計、API、そして今後の課題について取り上げます。 使用方法 Rubyバインディングを通してPrismパーサを使うにはrequire "prism"をして、Prismモジュールのparseメソッド、または他のparse_*系のメソッドを呼んでください。次に例を示します。 require "prism" Prism.parse("1 + 2") parseメソッドは、パース結果のオブジェクトを返します。こ
この記事はHaskell Advent Calendar 20234日目の記事です。 最近node-semverのパーサーを作る機会があったので、HappyとAlexを用いたパーサーの作り方について紹介します。あまりnode-semverの仕様には立ち入らず、HappyとAlexの使い方について焦点を当てます。 パーサーの実装はここです。 パーサの種類 パーサーの実装は主に手書きするか文法書から生成する2通りの方法があります。最も有名なのは再帰降下構文解析と、LR構文解析でしょうか。 PEGやパーサーコンビネータは再帰降下に属し、yaccやbisonはLR系の構文解析に属します。 こちらのサイトでは様々な構文解析法の分析をしています。箇条書きで抄訳したいと思います。 再帰降下系 わかりやすい 実はどの文法クラスに対応するか理論的に明らかになっていない 曖昧な文法を事前に検知できない 無限に
こんにちは、びしょ〜じょです。これはWORD Advent Calendar 2017の記事です。 12月3日といえば冴草きいちゃんの誕生日!!!! みんなで祝いましょう。 と思ったら『NEW GAME!』の遠山りんさんの誕生日でもあるのか!! この日はめでたいなぁ、国民の祝日にしましょう。 WORDとは何か 1. はじめに みなさんOCamlは書いてますか。今年はほとんどOCamlとLaTeXしか書いてません。 OCamlといえばメタランゲージとのことですので、メタランゲージでランゲージを作りたくなります。 syntax.mlみたいなファイルにデータタイプを定義して、そのあとどうしますか。 全部手打ちでしょうか、それとも… 2. パーザージェネレーター 人類は偉い! 人類は偉いのでパーザー自体を書かずともいい雰囲気のものを書くとパーザーを作ってくれるパーザージェネレーターというものがあり
Intro HTTPBis では、 RFC 8941: Structured Field Values (以下 SFV) の更新作業が行われている。 RFC 8941: Structured Field Values for HTTP https://www.rfc-editor.org/rfc/rfc8941.html 機能面では Date 型が追加されるという点が大きいが、個人的にはその裏で行われるもっと興味深い議論に注目したい。 それは、「RFC における ABNF の立ち位置」に関するものだ。 ABNF と Parsing Algorithm SFV は、簡単に言えば HTTP Field Value のための構造化フォーマットで、 JSON がそのまま使えなかったことに対する代替仕様だ。よって、基本的には目的となる構造体と文字列フォーマット間の Encode / Decode が
言語実装 Advent Calendar 2022の6日目です。 本記事ではLL(1)の素晴らしさと難しさについてDesk言語の開発の体験から語ります。 LL(1)とは LL(1)についてご存知でしょうか。 「LL(1)言語」「LL(1)文法」「LL(1)パーサ」でそれぞれ定義がありますが、一番分かりやすい「LL(1)パーサ」をざっくりいうと、ソースコードの頭から順番にトークン(ifや1や{など)を見ていきながらASTを構築するための情報を集める[1]パーサのうち、現在見ているトークンの種類を確認するだけで(それ以上の先読みなしに)ASTのノードの種類(IfやIntegerLiteralやBlock)を決定できるもののことです。 そしてLL(1)パーサでパースできるのがLL(1)文法であり、LL(1)言語であるというのがざっくりした説明です[2]。 次は、LL(1)パーサ(言語)のメリット
詳しい解説はネット上に沢山存在するので割愛しますが、ご覧のようにEBNFの表現の一つに(EBNFはいくつかの表現方法があるようです。例えばこれはW3Cが定義しているものです)似ています。違いは先に述べたようにChoiceの働きが異なるのと、文法上に先読みが存在することです。 このPEGを使って四則演算を受理するシンプルなルールを書くとすると、例えばこのようになります。 # expressionからパースが始まるとする expression <- additive additive <- multitive ("+" multitive / "-" multitive)* multitive <- primary ("*" primary / "/" primary)* primary <- "(" expression ")" / number number <- digit+ digit
昨日の記事では「書籍のマクロな構造」について話しました。 このマクロ構造はPandoc構造には組み込まれていません。 そのため、Pandocで書籍を作ろうと思うと、どうしたってPandoc構造にない部分を扱う別の仕組みが必要になります。 素のPandocでは、「書籍のマクロな構造を扱える外部の仕組み」を託す先として、主にLaTeXを利用しています。 裏を返すと、LaTeXは、書籍のマクロな構造を扱える仕組みです。 それなら最初からPandocではなく、LaTeXで本を作ればいいのではないでしょうか? この反論はもっともです。 実際、本を作るプロは黙ってLaTeXであったり、あるいはInDesignであったり、あるいはFrameMakerであったりを使います。 組版のプロの要求を実現するためには、これらのツールが持つ表現への自由度が必要だからです。 しかし原稿をもらう立場からすると、この高い
combine を使ったときに、例えば識別子のパース時に予約語を弾く方法。 最初は and_then を使うのかと思ったのだけど、 エラーの型指定がえらく面倒 だったので諦め。というか、なんか絶対違うだろうと思って別の方法を模索。 Parser のドキュメントに以下の例がある。これだ。 digit() .then(|d| { if d == '9' { value(9).left() } else { unexpected_any(d).message("Not a nine").right() } }) ということで、 then を使うと Parser を返す処理を書けるので、ここで unexpected_any を使って失敗させてやればよい。 ちょっとこのコードを見てぎょっとするのは left() と right() だが、これは if で分岐するパーサの戻り値が違うため。 rust
What is Menhir?Menhir is a LR(1) parser generator for the OCaml programming language. That is, Menhir compiles LR(1) grammar specifications down to OCaml code. Menhir was designed and implemented by Fran蔞is Pottier and Yann R嶲is-Gianas. Menhir is 90% compatible with ocamlyacc. Legacy ocamlyacc grammar specifications are accepted and compiled by Menhir. The resulting parsers run and produce correct
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く