Skip to content

Instantly share code, notes, and snippets.

@usagi
Created May 5, 2026 08:08
Show Gist options
  • Select an option

  • Save usagi/87f5f855b040019769b2e51233aec7f2 to your computer and use it in GitHub Desktop.

Select an option

Save usagi/87f5f855b040019769b2e51233aec7f2 to your computer and use it in GitHub Desktop.
zmbc/shakespearelang 実装準拠 日本語仕様書

Shakespeare Programming Language 仕様書

zmbc/shakespearelang 実装準拠 日本語仕様書

版: 0.1-draft 作成日: 2026-05-05 対象実装: zmbc/shakespearelang main ブランチ参照 対象読者: 実装者、言語処理系作者、仕様確認者


0. この文書の位置づけ

この文書は、zmbc/shakespearelang 実装に含まれる文法定義 shakespeare.ebnf、式評価実装 _expression.py、文実行実装 _operation.py から抽出した、Shakespeare Programming Language、以下 SPL、の日本語仕様書である。

この文書は、文学的なチュートリアルではない。ECMA-404 のように、できる限り短く、構文・意味・実行モデルを定義することを目的とする。

この文書は zmbc/shakespearelang 実装準拠 である。SPLという言語名で流通する他実装や歴史的仕様との差異は扱わない。


1. 適用範囲

本仕様は次を定義する。

  • SPLソーステキストの基本構造
  • 文字種および大文字小文字の扱い
  • 登場人物、Act、Scene、舞台指示、台詞の構文
  • 値、名詞句、式、演算子の意味
  • 代入、比較、条件、ジャンプ、入出力、スタック操作の意味
  • 実行時状態の概念
  • 実装依存事項およびエラー条件

本仕様は次を定義しない。

  • Pythonパッケージとしてのインストール方法
  • CLI引数の詳細
  • エラー表示形式
  • 対話REPLの完全仕様
  • 最適化、内部AST表現、パーサー実装の詳細

2. 用語

2.1 プログラム

SPLプログラムは、戯曲風のテキストである。プログラムはタイトル、登場人物一覧、Act、Scene、およびイベント列から成る。

2.2 登場人物

登場人物は、プログラム中の値を保持する変数である。登場人物は舞台上に存在する場合にのみ台詞を実行できる。

2.3 舞台

舞台は、現在入場している登場人物の集合である。

2.4 話者

台詞行の先頭に現れる登場人物である。

2.5 相手

話者以外に舞台上にいる、操作対象となる登場人物である。代入、入出力、スタック操作は原則として相手を対象にする。

zmbc実装では、話者から見た相手は実行時状態により決定される。通常のSPLプログラムでは、舞台上の登場人物を2人にしておくのが安全である。

2.6 値

値は整数である。登場人物は整数値とスタックを持つ。

2.7 グローバル真偽値

比較文の結果として設定される真偽値である。条件付き文はこの値を参照する。


3. 字句規則

3.1 大文字小文字

SPLの文法は大文字小文字を区別しない。

次は同じ構文要素として扱われる。

Romeo:
romeo:
ROMEO:

3.2 空白

空白は、構文要素の区切りとして用いられる。複数の空白、改行、インデントは、構文が許す範囲で同等に扱われる。

3.3 文末記号

多くの文、タイトル、Act名、Scene名、登場人物宣言は . または ! で終わる。

疑問文は ? で終わる。

3.4 角括弧

舞台指示は角括弧で囲む。

[Enter Romeo and Juliet]
[Exit Romeo]
[Exeunt]

4. プログラム構造

4.1 全体構造

SPLプログラムは次の順で構成される。

Title.

DramatisPersona*

Act*

4.2 タイトル

タイトルは、最初の . または ! までのテキストである。

The Tragedy of Seven.

タイトルは実行意味を持たない。

4.3 登場人物宣言

登場人物宣言は、登場人物名、カンマ、説明テキスト、文末記号から成る。

Romeo, a young man.
Juliet, a young woman.

説明テキストは実行意味を持たない。

登場人物名は、実装に定義された登場人物リストに含まれる必要がある。

4.4 Act

Actは次の形を持つ。

Act I: The First Act.

Act番号はローマ数字である。

Act名は実行意味を持たない。

4.5 Scene

Sceneは次の形を持つ。

Scene I: The First Scene.

Scene番号はローマ数字である。

Scene名は実行意味を持たない。

4.6 イベント

Scene内にはイベント列を置く。イベントは次のいずれかである。

  • 台詞行
  • 入場指示
  • 退場指示
  • 全員退場指示
  • ブレークポイント

5. 登場人物名

登場人物名は、実装に定義された名前のみ使用できる。

例:

Romeo
Juliet
Hamlet
Ophelia
Macbeth
Lady Macbeth
King Lear

複数語の登場人物名も存在する。

Lady Macbeth
King Lear
Friar Laurence
The Ghost

登場人物名は変数名として機能する。各登場人物は次を持つ。

  • 現在値
  • スタック
  • 舞台上にいるかどうかの状態

6. 舞台指示

6.1 入場

[Enter Romeo and Juliet]

指定された登場人物を舞台上に置く。

複数人を入場させる場合は、カンマおよび and を用いる。

[Enter Romeo, Hamlet and Juliet]

6.2 退場

[Exit Romeo]

指定された登場人物を舞台から除く。

6.3 全員退場

[Exeunt]

舞台上の全登場人物を退場させる。

6.4 指定全員退場

[Exeunt Romeo and Juliet]

指定された登場人物を退場させる。

6.5 ブレークポイント

[A pause]

ブレークポイントである。通常の実行意味は持たない。


7. 台詞行

7.1 構文

台詞行は登場人物名、コロン、1つ以上の文から成る。

Romeo:
  You are a cat.

1つの台詞行には複数の文を含めることができる。

Romeo:
  You are a cat. Open your heart.

7.2 実行条件

台詞を実行する話者は舞台上にいなければならない。

話者が舞台上にいない場合、実行時エラーである。


8. 値

値は次のいずれかである。

  • 一人称参照
  • 二人称参照
  • 名詞句
  • 登場人物名
  • nothing または zero

8.1 一人称参照

次は話者自身の現在値を表す。

I
me
myself

8.2 二人称参照

次は話者から見た相手の現在値を表す。

thee
thou
you
thyself
yourself

8.3 登場人物名参照

登場人物名は、その登場人物の現在値を表す。

Romeo
Juliet

8.4 ゼロ

次は整数 0 を表す。

nothing
zero

9. 名詞句

9.1 概要

名詞句は整数定数を表す。

名詞句の値は、名詞の極性と形容詞の個数で決まる。

9.2 正または中立の名詞句

正または中立の名詞句の値は次の通りである。

+2^n

ここで n は名詞句に含まれる形容詞の個数である。

例:

a cat              // +1
a big cat          // +2
a big big cat      // +4
a lovely rose      // +2
a lovely big rose  // +4

9.3 負の名詞句

負の名詞句の値は次の通りである。

-2^n

ここで n は名詞句に含まれる形容詞の個数である。

例:

a pig              // -1
a big pig          // -2
a big big pig      // -4
a rotten wolf      // -2

9.4 冠詞

冠詞は値に影響しない。

a
an
the

9.5 所有格

所有格は値に影響しない。

my
mine
thy
thine
your
his
her
its
their

9.6 形容詞

形容詞は、名詞句の絶対値を2倍にする。

形容詞の意味内容は評価に影響しない。個数のみが意味を持つ。

9.7 名詞の分類

名詞は次の分類を持つ。

  • 負の名詞
  • 中立の名詞
  • 正の名詞

中立名詞は正の名詞句として扱われる。

例:

pig       // 負の名詞
cat       // 中立名詞、値は正
rose      // 正の名詞

10. 式

式は単項式または二項式である。

10.1 二項式

二項式は次の構文を持つ。

<binary-operation> <value> and <value>

and は演算子ではなく、2つのオペランドを区切る構文要素である。

10.2 加算

the sum of A and B

意味:

A + B

例:

the sum of a cat and a cat      // 2
the sum of a big cat and a cat  // 3

10.3 減算

the difference between A and B

意味:

A - B

例:

the difference between a big big cat and a cat  // 3

10.4 乗算

the product of A and B

意味:

A * B

例:

the product of a big cat and a big big cat  // 8

10.5 商

the quotient between A and B

意味:

trunc(A / B)

商は整数である。zmbc実装では、C言語の整数除算に近い、0方向への切り捨てを行う。

除数が0の場合、実行時エラーである。

10.6 剰余

the remainder of the quotient between A and B

意味:

A % B

ただしzmbc実装では、C言語の fmod に近い挙動を整数化する。

除数が0の場合、実行時エラーである。

10.7 単項式

単項式は次の構文を持つ。

<unary-operation> <value>

10.8 2倍

twice A

意味:

A * 2

10.9 平方

the square of A

意味:

A^2

10.10 立方

the cube of A

意味:

A^3

10.11 平方根

the square root of A

意味:

trunc(sqrt(A))

結果は整数である。小数部は切り捨てられる。

負の値の平方根を取る場合、実行時エラーである。

10.12 階乗

the factorial of A

意味:

A!

負の値の階乗を取る場合、実行時エラーである。


11. 代入文

11.1 構文

代入文は二人称を主語として書く。

You are a cat.
Thou art a pig!

構文上、be 動詞は省略可能である。

11.2 意味

代入文は、話者から見た相手の現在値を指定値に設定する。

Romeo:
  You are a cat.

この文は、Romeoではなく、Romeoの相手の値を 1 にする。

11.3 修飾句

代入には次のような比較風の修飾が挟まる場合がある。

You are as good as a cat.

この修飾は値の評価に影響しない。代入される値は末尾の値である。


12. 比較文

12.1 概要

比較文は、グローバル真偽値を設定する。

比較文は疑問文として書かれ、? で終わる。

12.2 正比較

正比較は > を表す。

例:

Are you better than a pig?

意味:

you > -1

正比較語の例:

better than
bigger than
fresher than
friendlier than
nicer than
jollier than
more <positive-adjective> than

12.3 負比較

負比較は < を表す。

例:

Are you worse than a cat?

意味:

you < 1

負比較語の例:

punier than
smaller than
worse than
more <negative-adjective> than

12.4 中立比較

中立比較は == を表す。

例:

Are you as big as a cat?

意味:

you == 1

中立比較は次の形を持つ。

as <adjective> as

比較に使う形容詞の語感は、等値比較であること以外の意味を持たない。


13. 条件付き文

13.1 概要

文の先頭に条件句を置くことで、直前までに設定されたグローバル真偽値に応じて文を実行できる。

13.2 肯定条件

If so, <sentence>

グローバル真偽値が真の場合のみ、後続文を実行する。

13.3 否定条件

If not, <sentence>

グローバル真偽値が偽の場合のみ、後続文を実行する。

13.4 条件の対象

条件句は、それが付与された1文にのみ適用される。


14. ジャンプ

14.1 構文

Let us proceed to scene II.
We shall return to scene I.
We must proceed to scene III!

14.2 意味

現在のAct内にある指定Sceneへ制御を移す。

指定Sceneが現在のAct内に存在しない場合、実行時エラーである。

14.3 Actをまたぐジャンプ

zmbc実装のジャンプは、現在のAct内のScene番号を対象とする。Actをまたぐ直接ジャンプはこの構文では定義されない。


15. 入出力

15.1 数値出力

Open your heart.

話者から見た相手の現在値を数値として出力する。

15.2 文字出力

Speak your mind.

話者から見た相手の現在値を文字コードとして出力する。

15.3 数値入力

Listen to your heart.

数値入力を1つ読み取り、話者から見た相手の現在値に設定する。

15.4 文字入力

Open your mind.

文字入力を1文字読み取り、その文字コード値を話者から見た相手の現在値に設定する。


16. スタック操作

16.1 Push

Remember <value>.

指定値を、話者から見た相手のスタックに積む。

例:

Remember a cat.

16.2 Pop

Recall something.

話者から見た相手のスタックから値を取り出し、その登場人物の現在値に設定する。

Recall の後ろのテキストは、句読点まで読み取られるが、値の指定としては扱われない。

空のスタックから取り出す場合は実行時エラーとなる可能性がある。


17. 実行モデル

17.1 初期状態

各登場人物は、現在値とスタックを持つ。初期値は実装に依存するが、通常は0として扱われる。

グローバル真偽値の初期値は実装に依存する。

17.2 実行順序

プログラムは、Act、Scene、イベントの順に実行される。

Scene内では、イベントが記述順に実行される。

ジャンプ文が実行された場合、現在位置が指定Sceneへ変更される。

17.3 台詞の複数文

1つの台詞行に複数の文がある場合、左から右へ順に実行される。

17.4 舞台上制約

台詞の話者は舞台上にいなければならない。

式評価時の一人称参照・二人称参照・代入・入出力・スタック操作は、舞台状態に依存する。


18. ローマ数字

Act番号、Scene番号、ジャンプ先Scene番号はローマ数字で表す。

例:

I
II
III
IV
V
X
MCCCXXXVII

zmbc実装の文法では、大文字小文字は区別されない。


19. 語彙

19.1 be動詞

am
are
art
be
is

19.2 冠詞

a
an
the

19.3 一人称

I
me
myself

19.4 二人称

thee
thou
you
thyself
yourself

19.5 一人称所有格

mine
my

19.6 二人称所有格

thine
thy
your

19.7 三人称所有格

his
her
its
their

19.8 負の名詞の例

Hell
Microsoft
bastard
beggar
blister
codpiece
coward
curse
death
devil
draught
famine
flirt-gill
goat
hate
hog
hound
leech
lie
pig
plague
starvation
toad
war
wolf

19.9 中立名詞の例

animal
aunt
brother
cat
chihuahua
cousin
cow
daughter
door
face
father
fellow
granddaughter
grandfather
grandmother
grandson
hair
hamster
horse
lamp
lantern
mistletoe
moon
morning
mother
nephew
niece
nose
purse
road
roman
sister
sky
son
squirrel
thing
town
tree
uncle
wind

注: 実装文法には stone wall のように複数語として現れる箇所がある。これは stone wall として扱われる可能性がある。

19.10 正の名詞の例

Heaven
King
Lord
angel
flower
happiness
joy
plum
summer's day
hero
rose
kingdom
pony

19.11 中立形容詞の例

big
black
blue
bluest
bottomless
furry
green
hard
huge
large
little
normal
old
purple
red
rural
small
tiny
white
yellow

19.12 正の形容詞の例

amazing
beautiful
blossoming
bold
brave
charming
clearest
cunning
cute
delicious
embroidered
fair
fine
gentle
golden
good
handsome
happy
healthy
honest
lovely
loving
mighty
noble
peaceful
pretty
prompt
proud
reddest
rich
smooth
sunny
sweet
sweetest
trustworthy
warm

19.13 負の形容詞の例

bad
cowardly
cursed
damned
dirty
disgusting
distasteful
dusty
evil
fat-kidneyed
fatherless
fat
foul
hairy
half-witted
horrible
horrid
infected
lying
miserable
misused
oozing
rotten
smelly
snotty
sorry
stinking
stuffed
stupid
vile
villainous
worried

20. 構文要約

この節は理解用の要約であり、完全なEBNFではない。

play            = title, dramatis-personae, act* ;
dramatis-persona = character, ",", text, ("." | "!") ;
act             = "Act", roman, ":", text, ("." | "!"), scene* ;
scene           = "Scene", roman, ":", text, ("." | "!"), event* ;
event           = line | entrance | exit | exeunt | breakpoint ;
line            = character, ":", sentence+ ;
sentence        = [condition], operation ;
condition       = "If so," | "If not," ;
operation       = question | assignment | goto | output | input | push | pop ;
value           = expression | first-person | second-person | noun-phrase | character | nothing ;
expression      = binary-expression | unary-expression ;
binary-expression = binary-operation, value, "and", value ;
unary-expression  = unary-operation, value ;

21. 例

21.1 数値7を出力する

The Tragedy of Seven.

Romeo, a young man.
Juliet, a young woman.

Act I: The Only Act.

Scene I: The Only Scene.

[Enter Romeo and Juliet]

Romeo:
  You are the sum of a big big cat and the sum of a big cat and a cat.
  Open your heart.

意味:

a cat         = 1
a big cat     = 2
a big big cat = 4
4 + (2 + 1)   = 7

21.2 条件分岐

Romeo:
  Are you better than a pig?
  If so, let us proceed to scene II.
  If not, let us proceed to scene III.

意味:

  1. 相手の値が -1 より大きいか調べる。
  2. 真ならScene IIへ進む。
  3. 偽ならScene IIIへ進む。

21.3 スタック

Romeo:
  Remember a big cat.
  You are a pig.
  Recall your crime.
  Open your heart.

意味:

  1. 相手のスタックへ 2 をpushする。
  2. 相手の現在値を -1 にする。
  3. 相手のスタックからpopして現在値を 2 に戻す。
  4. 相手の現在値を数値出力する。

22. エラー条件

次の場合、実行時エラーとなる。

  • 話者が舞台上にいない。
  • 二人称参照または相手操作に必要な相手が決定できない。
  • 存在しないSceneへジャンプする。
  • 0で除算する。
  • 負数の平方根を取る。
  • 負数の階乗を取る。
  • 空スタックからpopする。
  • 未定義または文法にない語を使用する。

23. 実装依存事項

次はzmbc実装に依存する。

  • 登場人物名の完全なリスト
  • 名詞、形容詞、比較語の完全なリスト
  • 初期値および初期グローバル真偽値
  • 二人称の相手決定規則の詳細
  • 入出力の具体的な文字エンコーディング
  • REPL入力の受理範囲
  • エラー文言

24. 参考実装ファイル

本仕様は主に次のファイルを参照して作成した。

https://github.com/zmbc/shakespearelang/blob/main/shakespearelang/shakespeare.ebnf
https://github.com/zmbc/shakespearelang/blob/main/shakespearelang/_expression.py
https://github.com/zmbc/shakespearelang/blob/main/shakespearelang/_operation.py
https://github.com/zmbc/shakespearelang/blob/main/shakespearelang/_state.py
https://github.com/zmbc/shakespearelang/blob/main/LICENSE

25. ライセンス及びオーサー

この文書を作成するにあたり参照した zmbc/shakespearelang は MIT License で公開されている。

この文書は、実装の動作を説明するために、ソースコードから抽出した構文名、語彙、挙動を記述している。原実装を再配布または派生物として同梱する場合は、原著作権表示およびMIT Licenseの条件を確認すること。


付録A. 代表的な定数生成

SPL表現
nothing 0
zero 0
a cat 1
a big cat 2
a big big cat 4
a rose 1
a lovely rose 2
a pig -1
a big pig -2
a big big pig -4

付録B. 代表的な演算

SPL表現 意味
the sum of A and B A + B
the difference between A and B A - B
the product of A and B A * B
the quotient between A and B trunc(A / B)
the remainder of the quotient between A and B A % B 相当
twice A A * 2
the square of A A^2
the cube of A A^3
the square root of A trunc(sqrt(A))
the factorial of A A!

付録C. 代表的な命令

SPL表現 意味
You are A. 相手へ A を代入
Are A better than B? A > B をグローバル真偽値へ設定
Are A worse than B? A < B をグローバル真偽値へ設定
Are A as good as B? A == B をグローバル真偽値へ設定
If so, S. 真なら S を実行
If not, S. 偽なら S を実行
Let us proceed to scene I. 現在Act内のScene Iへジャンプ
Open your heart. 相手の値を数値出力
Speak your mind. 相手の値を文字出力
Listen to your heart. 数値入力を相手へ代入
Open your mind. 文字入力を相手へ代入
Remember A. 相手のスタックへpush
Recall X. 相手のスタックからpop
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment