Pegjs: Π˜ΠΌΠΏΠΎΡ€Ρ‚ / Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 16 Π°Π²Π³. 2011  Β·  32ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: pegjs/pegjs

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΏΡƒΡ‚Π΅ΠΌ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° ΠΏΡ€Π°Π²ΠΈΠ» ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ.

НСсколько идСй;

<strong i="7">@include</strong> "expression.pegjs"
(or <strong i="8">@from</strong> "expression.pegjs" import expression)

tag_if
    = "if" space? expression space? { ... }

<strong i="9">@import</strong> "expression.pegjs" as expr

tag_if
    = "if" space? expr.expression space?

Π’ ΠΈΠ΄Π΅Π°Π»Π΅ это Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ всСго ΠΊΠΎΠ΄Π° Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ .pegjs, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ; Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΌ придСтся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ parse () Π½Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅;

Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² соотвСтствии с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ Π² ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ options ;

parse(input, startRule)
->
parse(input, { startRule: "...", startPos : 9000 })

И Π² ΠΊΠΎΠ½Ρ†Π΅, Ссли startPos != 0 && result !== null , ΠΌΡ‹ Π½Π΅ провСряСм, дошли Π»ΠΈ ΠΌΡ‹ Π΄ΠΎ input.length , Π° вмСсто этого Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ endPos (Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ знаю, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ элСгантно. - ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ options?).

Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ Π±Ρ‹ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎ, Π½Π° ΠΌΠΎΠΉ взгляд, являСтся двумя Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ аспСктами кодирования Π² Ρ†Π΅Π»ΠΎΠΌ.

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

@Dignifiedquire Π’ настоящСС врСмя я Π΄ΡƒΠΌΠ°ΡŽ ΠΎ синтаксисС ΠΈ сСмантикС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, вСроятно, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

static-languages.pegjs

langauges  = "C" / "C++" / "Java" / "C#"

динамичСский-languages.pegjs

languages = "Ruby" / "Python" / "JavaScript"

all-languages.pegjs

static  = require("./static-languages")
dynamic = require("./dynamic-languages")

all = static.languages / dynamic.languages

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .pegjs Π±ΡƒΠ΄Π΅Ρ‚ нСявно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС содСрТащиСся Π² Π½Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ <name> = require(<module>) ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Π’ΠΎΠ³Π΄Π° Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π±ΡƒΠ΄ΡƒΡ‚ доступны Π²Π½ΡƒΡ‚Ρ€ΠΈ пространства ΠΈΠΌΠ΅Π½.

Π­Ρ‚ΠΎΡ‚ Π΄ΠΈΠ·Π°ΠΉΠ½ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Node.js. ИспользованиС пространств ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ². Π― Π²ΠΈΠΆΡƒ Π΄Π²Π° нСдостатка:

  1. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ <name> = require(<module>) слишком ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° опрСдСлСния ΠΏΡ€Π°Π²ΠΈΠ» ΠΈ поэтому ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ импортируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ).
  2. Бинтаксис . ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ . , ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Β«Π»ΡŽΠ±Ρ‹ΠΌ символом». Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, . ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «любой символ», Π° . ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, отдСляСт имя пространства ΠΈΠΌΠ΅Π½ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°) ΠΈΠ»ΠΈ ΠΏΡƒΡ‚Π΅ΠΌ измСнСния синтаксиса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова any для прСдставлСния «любого символа»).

ВсС 32 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π― согласСн, Ρ‡Ρ‚ΠΎ это ваТная функция, я Ρ…ΠΎΡ‡Ρƒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это послС вСрсии 1.0.

(ΠšΡΡ‚Π°Ρ‚ΠΈ, ΠΌΠ½Π΅ Π½Π΅ нравится Python-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ синтаксис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚Π΅ - Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° require Node.js Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°ΠΊΠΎΠΌΠΎ программистам JavaScript. Но это второстСпСнная Π²Π΅Ρ‰ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡ‚ΡŽΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.)

Π’Ρ‹ Π±Ρ‹ рассматривали Π΅Π³ΠΎ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄ΠΎ вСрсии 1.0, Ссли Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» снабТСн ΠΏΠ°Ρ‚Ρ‡Π΅ΠΌ?

Π― согласСн с вашим Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ΠΌ ΠΎ синтаксисС Python.

+1 Π·Π° эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

@ceymard Π”Π°, я Π±Ρ‹ рассмотрСл это.

+1 Π·Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ +1 Π·Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ стиля require

@dmajda @ceymard Π£ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ мысли ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ это Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ? МнС это Π½ΡƒΠΆΠ½ΠΎ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈ я ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Вопрос Π² Ρ‚ΠΎΠΌ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π»ΠΈ это Π±Ρ‹Ρ‚ΡŒ просто Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ Π½Π° нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ наслСдования, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ всС ΠΏΡ€Π°Π²ΠΈΠ»Π°, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π² Π½ΠΎΠ²ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅.

@Dignifiedquire Π’ настоящСС врСмя я Π΄ΡƒΠΌΠ°ΡŽ ΠΎ синтаксисС ΠΈ сСмантикС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, вСроятно, Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅:

static-languages.pegjs

langauges  = "C" / "C++" / "Java" / "C#"

динамичСский-languages.pegjs

languages = "Ruby" / "Python" / "JavaScript"

all-languages.pegjs

static  = require("./static-languages")
dynamic = require("./dynamic-languages")

all = static.languages / dynamic.languages

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» .pegjs Π±ΡƒΠ΄Π΅Ρ‚ нСявно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС содСрТащиСся Π² Π½Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ <name> = require(<module>) ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Π’ΠΎΠ³Π΄Π° Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π±ΡƒΠ΄ΡƒΡ‚ доступны Π²Π½ΡƒΡ‚Ρ€ΠΈ пространства ΠΈΠΌΠ΅Π½.

Π­Ρ‚ΠΎΡ‚ Π΄ΠΈΠ·Π°ΠΉΠ½ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Node.js. ИспользованиС пространств ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ². Π― Π²ΠΈΠΆΡƒ Π΄Π²Π° нСдостатка:

  1. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ <name> = require(<module>) слишком ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° опрСдСлСния ΠΏΡ€Π°Π²ΠΈΠ» ΠΈ поэтому ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ (ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ импортируСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ).
  2. Бинтаксис . ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ΅Ρ‚ с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ . , ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся Β«Π»ΡŽΠ±Ρ‹ΠΌ символом». Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠ΅ΠΌΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, . ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «любой символ», Π° . ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, отдСляСт имя пространства ΠΈΠΌΠ΅Π½ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°) ΠΈΠ»ΠΈ ΠΏΡƒΡ‚Π΅ΠΌ измСнСния синтаксиса (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с использованиСм ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова any для прСдставлСния «любого символа»).

@dmajda ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ <identifier> = <expression> ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ опрСдСлСниями ΠΏΡ€Π°Π²ΠΈΠ», ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π±Ρ‹ Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ этого:

static := require("./static-languages")
dynamic := require("./dynamic-languages")

all = static::languages / dynamic::languages

:: Π½ΠΈΠ³Π΄Π΅, насколько ΠΌΠ½Π΅ извСстно, Π² PEG.js Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈ позволяСт Π»Π΅Π³ΠΊΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ пространства ΠΈΠΌΠ΅Π½ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ. Π― Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½ насчСт := ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚, Π½ΠΎ каТСтся ΠΎΡ‡Π΅Π½ΡŒ Ρ‡ΡƒΠΆΠ΄Ρ‹ΠΌ Javascript ..

Π’Π°ΠΊΠΆΠ΅, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пространства ΠΈΠΌΠ΅Π½, считаСтС Π»ΠΈ Π²Ρ‹, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ пространство ΠΈΠΌΠ΅Π½ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ способ создания Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… пространств ΠΈΠΌΠ΅Π½ Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

static := {
  languages  = "C" / "C++" / "Java" / "C#"
}

dynamic := {
  languages = "Ruby" / "Python" / "JavaScript"
}

Π― Π½Π΅ большой ΠΏΠΎΠΊΠ»ΠΎΠ½Π½ΠΈΠΊ :: ΠΈ := , ΠΎΠ½ΠΈ выглядят Ρ‡ΡƒΠΆΠΈΠΌΠΈ Π² ΠΌΠΈΡ€Π΅ javaScript / CoffeeScript.

Π― Ρ‚Π°ΠΊΠΆΠ΅ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π±Ρ‹Π»ΠΎ просто ΠΈ нСявно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ пространства ΠΈΠΌΠ΅Π½, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ Ρ„Π°ΠΉΠ»Ρ‹. НС Π²ΠΈΠΆΡƒ большой нСобходимости Π² Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТном.

Как насчСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ просто:

<strong i="6">@require</strong> foo = "./foo"

bar = foo:languages

Π”Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ - это компромисс, Π½ΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для раздСлСния пространств ΠΈΠΌΠ΅Π½ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… мСстах: C ++, C #, XML ΠΈ Ρ‚. Π”.

: всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с cons для ΠΌΠ½ΠΎΠ³ΠΈΡ…, ΠΌΠ½ΠΎΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… программистов. Π― ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ подальшС ΠΎΡ‚ этого ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°. МнС нравится :: . Π Π°Π·Π²Π΅ это Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для пространств ΠΈΠΌΠ΅Π½ C ++? Π― Π΅Ρ‰Π΅ Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ . - Ρ‚ΠΎΠΆΠ΅ ΠΏΠ»ΠΎΡ…ΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€.

. нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· критичСского измСнСния. Π­Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ двусмыслСнно Π½Π° языкС.

:: ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² C ++ для пространств ΠΈΠΌΠ΅Π½ ΠΈ Π² C # для прСфиксов пространств ΠΈΠΌΠ΅Π½ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, global::System ).

Π― Π΄ΡƒΠΌΠ°Π» ΠΎ быстром ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡƒΡ‚ΠΈ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅ - Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ простоС наслСдованиС - склСйтС Ρ„Π°ΠΉΠ»Ρ‹ pegjs вмСстС, сохранив всС пространство ΠΈΠΌΠ΅Π½.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ слишком многословной ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ этапа построСния, Π½ΠΎ, глядя Π½Π° ΡΠ²Π΅Ρ‚Π»ΡƒΡŽ сторону, это заставит вас ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ DRY ΠΈ OTW.

Π§Ρ‚ΠΎ касаСтся Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ, Π½Π΅ говоря ΡƒΠΆΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ это ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для этой Ρ‚Π΅ΠΌΡ‹, Π½ΠΎ это просто Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ стоит Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, я собирался ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ простой__

languages = static__languages / dynamic__languages
<static-languages.pegjs>
<dynamic-languages.pegjs>
/* alternative */
languages = STATIC__languages / DYNAMIC__languages

@andreineculau Π― Π² основном ΡƒΠΆΠ΅ дСлаю это Π½Π° этапС сборки, поэтому, Ссли Π²Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ просто ΠΈΡ‰Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ для создания ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ· Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ с Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ зависимостСй (Π³Π΄Π΅ создаСтся ΠΎΠ΄ΠΈΠ½ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ), я ΠΌΠΎΠ³ Π±Ρ‹ очиститС Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ мСня Π΅ΡΡ‚ΡŒ, ΠΈ отпуститС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ обсуТдСниС ΠΌΠΎΠ³Π»ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊ Π±ΠΎΡ€ΠΎΡ‚ΡŒΡΡ с этим Π±ΠΎΠ»Π΅Π΅ постоянным способом.

Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° Π²Π΅Ρ‰ΡŒ: ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ этому Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ синтаксиса Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ упускаСт Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎΠ΅, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· основных ΠΏΡ€ΠΈΡ‡ΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρƒ всСх нас Π΅ΡΡ‚ΡŒ Π·ΡƒΠ΄ ΠΎΡ‚ использования ΠΏΡ€Π°Π²ΠΈΠ» ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ (другая - ΡΡΠ½ΠΎΡΡ‚ΡŒ), - это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π»ΠΎΠ³ΠΈΠΊΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, хотя сгСнСрированныС синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ осмыслСнно ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ составлСны Π²ΠΎ врСмя синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, каТСтся Π²Π°ΠΆΠ½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π΅Ρ€Π΅Π²ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΎ Π΄Π΅Ρ€Π΅Π²ΠΎ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ², Π° Π½Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠ½ΠΎΠ»ΠΈΡ‚Π½Ρ‹ΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π­Ρ‚ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½Π°Π±ΠΎΡ€ парсСров Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π°ΡΡ‚ΡŒΡŽ Π²Π΅Π±-интСрфСйса, Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ раздувания сгСнСрированного ΠΊΠΎΠ΄Π°.

@odonnell +1 Π·Π° выпуск Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ - нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ вас врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ это ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ

ΠΈ +1 Π·Π° Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΡ. Π­Ρ‚ΠΎ слСдуСт Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ быстроС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π° Π½Π΅ ΠΊΠ°ΠΊ долгосрочноС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

@odonnell, ΠΌΠΎΠΉ взгляд Π½Π° это ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° https://github.com/andreineculau/core-pegjs - поТалуйста, Ρ‚ΠΊΠ½ΠΈΡ‚Π΅ мСня, Ссли Ρƒ вас Π΅ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΡˆΠ΅.

+1 Π·Π° эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ

: +1:

: +1:

: +1:

Π― пошСл ΠΈ написал ΠΏΠ»Π°Π³ΠΈΠ½ / Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для PEG.js, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выполняСт ΠΈΠΌΠΏΠΎΡ€Ρ‚: https://github.com/casetext/pegjs-import.

+1 Π·Π° это Ρ‚ΠΎΠΆΠ΅.

Π― Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽ это Π² # 308 Π² ΠΎΠ±Ρ‰Π΅ΠΌ Π²ΠΈΠ΄Π΅: Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ - это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ способ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ.

ΠžΡ‚Π»ΠΈΡ‡Π½Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ: +1:

Π‘ Π½Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π½ΠΈΠ΅ΠΌ ΠΆΠ΄Ρƒ Π΅Π³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π°.

: +1:

ΠŸΠΎΡ‚Ρ€ΡΡΠ°ΡŽΡ‰ΠΈΠΉ! : +1:

@dmajda Π― ΠΎΠΏΠ°Π·Π΄Ρ‹Π²Π°ΡŽ Π½Π° эту Π²Π΅Ρ‡Π΅Ρ€ΠΈΠ½ΠΊΡƒ, Π½ΠΎ ΠΌΠ½Π΅ интСрСсно, ΠΊΠ°ΠΊ часто Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ» ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ Url ΠΈ Email Π² ΠΌΠΎΠΈ составлСнныС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Π½ΠΎ мСня Π½Π΅ Π²ΠΎΠ»Π½ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ Url ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π²Π΅Ρ‰ΠΈ, ΠΊΠ°ΠΊ HierarchicalPart ΠΈ AsciiLetter . Как Π²Ρ‹ Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ экспорта Node ТизнСспособным ΠΏΡƒΡ‚Π΅ΠΌ, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΌ прСимущСства пространств ΠΈΠΌΠ΅Π½, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΌ прямой ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΈΠΌΠΏΠΎΡ€Ρ‚?

import { SchemalessUrl, Url } from "./Urls.pegjs"

Token
  = PhoneNumber
  / Url
  / SchemalessUrl

ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ для мСня, ΠΊΠΎΠ³Π΄Π° я ΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ написаниС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Π°Ρ‡Π΅. Π― застрял прямо сСйчас, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„Π°ΠΉΠ»Ρ‹ Π² Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ называя Π²Π΅Ρ‰ΠΈ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΈ Π½Π°Π·Π²Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ PHP Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ прСдставили ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ пространства ΠΈΠΌΠ΅Π½: UrlIpHost , HtmlQuotedString ΠΈ Ρ‚. Π”.

@dmajda @futagoza

Π•ΡΡ‚ΡŒ Π»ΠΈ прогрСсс ΠΏΠΎ этому вопросу? ΠΈΠ»ΠΈ пСрвичная дискуссия, Тивущая сСйчас Π½Π° # 473?
Мой Ρ„Π°ΠΉΠ» Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΎΡ‡Π΅Π½ΡŒ быстро растСт :(
Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° нСсколько

Π― Π±Ρ‹ Π½Π΅ ΠΏΡ€ΠΎΡ‡ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ просто для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ упростило Π±Ρ‹ ΠΈΡ… тСстированиС ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС, Π° Ρ‚Π°ΠΊΠΆΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, прСдоставило Π±Ρ‹ способ динамичСской Π·Π°ΠΌΠ΅Π½Ρ‹ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ? ΠŸΡ€ΠΎΡΡ‚ΠΎ мысли.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я использовал Π² качСствС основы, содСрТит Π±ΠΎΠ»Π΅Π΅ 1300 строк. ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ врСмя, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Π³Π΄Π΅ всС Π±Ρ‹Π»ΠΎ, ΠΏΡ€Ρ‹Π³Π°Ρ‚ΡŒ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹.

@mikeaustin Π― Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽ эту Ρ„ΠΈΡ‡Ρƒ ΠΊΠ°ΠΊ своСго Ρ€ΠΎΠ΄Π° Node.JS required :

кошка bash.pegjs
{
const _ = require ("ΠΏΡ€ΠΎΠ±Π΅Π»");
const LB = require ("line_break");
const CodeBlock = require ("code_block");
const BoolExpr = require ("логичСскоС_Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅");
}
...
IfStatement = "if" _ "[" BoolExpr "]" _ ";" _ "Ρ‚ΠΎΠ³Π΄Π°" LB? CodeBlock "Ρ„ΠΈ"

Π― согласСн, Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ ΠΈ созданиС ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… - отличная функция, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ‚Π°ΠΊΠΈΡ… случаСв ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ:
1- ΠΏΠΎΠ΄Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°, которая полагаСтся Π½Π° Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, которая Π±Ρ‹Π»Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² основном ΠΊΠΎΠ΄Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ?
2- ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ имя Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ?

ИМО, Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ созданиС Π½ΠΎΠ²ΠΎΠ³ΠΎ дополнСния для PEG.js (нСзависимо ΠΎΡ‚ PEG.js), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ опрСдСляСт ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, @load (anotherGrammarFileLocation)), ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ javacsript / peg.js,
ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ reg-exp ΠΈΠ»ΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ привязки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ это ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ содСрТимым "anotherGrammarFile Location", ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² PEG.js

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Ρ†Π΅Π»Ρ‹Π΅ числа.pegjs

integers=[0-9]* {return parseInt(text())}

main.pegjs
arrayOfInteger="["(integers ",")* integers"]"
@load("integers.pegjs")

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° использованиС этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ссли ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΈ помСстил @load ΠΏΠ΅Ρ€Π΅Π΄ "arrayOfInteger", peg.js ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ ΠΏΠ΅Ρ€Π²ΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΠΎ (цСлочислСнная Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°)

Один ΠΈΠ· способов ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с этим состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΠΎΠΌΡƒ объявлСнию Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС содСрТимоС Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π°.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ нСсти ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π·Π° любоС Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

Π― просто Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ связана с запросом Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ° / ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ - это Ρ‚ΠΎ, Ρ‡Π΅Π³ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, особСнно ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ вСсь спСктр Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ.

Если Π²Π°ΠΌ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ Π΄Π»ΠΈΠ½ΠΎΠΉ Π² 1 тыс. Π‘Ρ‚Ρ€ΠΎΠΊ, Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅ Π΅Π΅ ΠΈ соСдинитС ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ, ΠΊΠ°ΠΊ считаСтС Π½ΡƒΠΆΠ½Ρ‹ΠΌ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π² pegjs.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ