Pegjs: コマンドラインからデプロイする方法は?

作成日 2017年06月06日  ·  24コメント  ·  ソース: pegjs/pegjs

検証する.pegファイル(オンライン)を作成しました。 コマンドラインで自宅で使用したいと思います。 Ubuntu16.04リポジトリからpegjsをインストールしました。 pegjs tldr.pegを実行すると、 tldr.jsファイルが生成されました。

コマンドラインでそれを使用するにはどうすればよいですか? 確認したいファイルがあります。

question

最も参考になるコメント

いいね! より完全な例、@ jodevsaを作成していただきありがとうございます。 私は彼がJavaScriptを知っていると思っていました。

しかし、そういうことで、JavaScriptをまったく知らなくてもPEG.jsを使いたいと思うかもしれないという考えが浮かび上がります。 文法や入力ファイルを一般的に読み取って、ファイルや標準出力に出力できるプログラムを用意しておくと便利だと思います。

全てのコメント24件

したがって、作成した.pegを使用するコマンドラインツールを作成し、コマンドラインパラメーターに基づいてファイルを検証する必要があります。 私は正しいですか?

例:
validate_file ~/file.blah

@ pepa65

@jodevsaそれが私が達成しようとしていることです..!

生成されたtldr.jsは、解析関数によって呼び出される単なる一般的なライブラリです。これを実行するプログラムを作成する必要があります。

1-ファイルを読む
2-ファイルコンテンツをtldrライブラリに送信します
3-出力結果?

PEG.jsで生成されたライブラリ関数の定義:

var parser=require('./tldr').parse;

必要なファイルからデータを抽出し、parser(fileContent)を使用してください!

Nodeを使用している場合、より具体的な例を次に示します。

#!/usr/bin/env node

'use strict';

//
// echo "2 + 3" | node compile.js arithmetics.pegjs
// echo "2 + 3" | node compile.js javascript.pegjs
//

let fs = require('fs');
let peg = require('../lib/peg');

let grammar = fs.readFileSync(process.argv[2]).toString();
let parser = peg.generate(grammar);
let input = [];

compile(process.stdin);

function compile(stdin) {
  stdin.resume();
  stdin.setEncoding('utf8');

  stdin.on('data', (data) => input.push(data));

  stdin.on('end', () => {
    let output = parser.parse(input.join('').trim());

    console.log(JSON.stringify(output, null, 2));
  });
}

たぶん、それをより一般的に行うアプリがあると便利でしょう。

@mikeaustin明らかに、これはあなたが何をしたかを彼が理解するための最も簡単な方法ではありません
@ pepa65これをチェックしてください:

#!/usr/bin/env node
'use strict';

const fs = require('fs');
const parser = require('./tldr.js').parse;

function main() {
    const args = require('process').argv;
    if (args.length != 3) {
        console.error("Enter file Path as argument.")
        return 1;
    }
    let filename = args[2];
    fs.readFile(filename, {encoding: 'utf8'},function(err, data) {
        if (err) {
            console.log("error while reading the file!");
            console.error(err);
            return 1;
        }

        try {
            let output = parser(data);
            console.log(output)

        } catch (e) {
            console.error(e.message);

        }


    });

}

main();

  • tldr.jsと一緒にフォルダに入れて、check_fileという名前を付けたとしましょう。

  • chmod + x check_file

  • 〜/ .bashrcの$ pathにフォルダの場所を追加し、ターミナルをリセットします

  • これで、check_file〜 / file.txtのように使用できます。

@mikeaustin node-pegjs(およびpeg)がインストールされているのに、 ../lib/pegがないようです。

私が求めているのは、次のように呼び出すことができる一般化されたノードスクリプトです。 peg-check tldr.pegjs file-to-be-checkedここで、tldr.pegjsはpegjs tldr.peg tldr.pegjsの出力であり、 file-to-be-checkedにはチェック対象のテキストが含まれています。

または、pegjsがオプションでtldr.pegjsを組み込んだスクリプトを出力できる場合、 pegjs tldr.peg -s tldr-checkは次のように使用できるスクリプトを出力します: tldr-check file-to-be-checked 、これによりpegjsの使いやすさが向上します初心者のために非常に..!

@jodevsaありがとう!
私は得た

let output = parser(data);
            ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode

だから私は'use strict';を追加しましたが、それから私は得ました:

const arguments = require('process').argv;
          ^^^^^^^^^

SyntaxError: Unexpected eval or arguments in strict mode

私のjavascript-fuは十分に強力ではないと思います...

@ pepa65コードを更新しました、もう一度確認してください
私の悪い:(

@ pepa65ノード

@ pepa65
NVM、これを試してみてください

#!/usr/bin/env node

  'use strict';

  var fs = require('fs');
  var parser = require('./tldr.js').parse;

  function main() {
      var args = require('process').argv;
      if (args.length != 3) {
          console.error("Enter file Path as argument.")
          return 1;
      }
      var filename = args[2];
      fs.readFile(filename, {encoding: 'utf8'},function(err, data) {
          if (err) {
              console.log("error while reading the file!");
              console.error(err);
              return 1;
          }

          try {
              var output = parser(data);
              console.log(output)

          } catch (e) {
              console.error(e.message);

          }


      });

  }

  main();

constはここで正常に機能します。 私がヒットした唯一の問題は、tldr.jsにprintf(console.logに置き換えた)が含まれていることでしたが、それでも機能します!
何があっても出力がundefinedで終わることを私が理解していない唯一のこと。

奇妙なことに、javascriptには「printf」関数すら含まれていません。 さらに古いバージョン
文法を公開しても大丈夫なら、私が手伝ってくれるほうが簡単でしょう

O、申し訳ありませんが、ペグを確認しましたが、 { printf("OK");}間違って追加したことがわかったので、変更しました。
しかし、それでも未定義で終わります。 私の文法:

page = header description examples eof { console.log("OK");}
header = command nl underline nl nl
description = (descriptor nolowercase any dot nl)+
examples = example (nl example)*
example = example_description nl example_command
example_description = nolowercase any colon nl
example_command = fourspace any nl
command = [a-zA-Z0-9_][-a-zA-Z0-9_ ]*
underline = '='+
any = [a-z ()-,-.={}/_0-9A-Z]*
nolowercase = [^a-z]
descriptor = '> '
fourspace = '    '
dot = .
colon = ':'
nl = [\n]
eof = !.

@ pepa65 @jodevsaはあなたを与えたことを実行しているスクリプトは、ペグ文法の実行結果をログに記録するのだから。 トップレベルのpageルールはconsole.logで終わるため、PEGは実行中のスクリプトにundefinedを返します。

console.log(OK)return "OK";に変更するか、印刷されたundefinedを無視するか、実行中のスクリプトからconsole.log(output)行を削除することができます。

お役に立てば幸いです。

@hawkrives :+1:

そう、私はばかげている。 簡単になります! 先に進むことができるところまで来たと思います。 皆さん、ありがとうございました!

最終的な答えを探してここに来る人たちの要約として、このスクリプトを使用して、おそらくgrammar-checkと呼んでください。

#!/usr/bin/env node
'use strict';

const fs = require('fs');
const parser = require('./grammar.js').parse;

function main() {
  const args = require('process').argv;
  if (args.length != 3) {
    console.error("Only 1 argument needed: file-path")
    return 1;
  }
  const filename = args[2];
  fs.readFile(filename, {encoding: 'utf8'}, function(err, data) {
    if (err) {
      console.log("Error reading file", filename);
      console.error(err);
      return 1;
    }
    try {
      let output = parser(data);
      console.log(output);
    }
    catch (e) {
      console.error(e.message);
    }
  });
}

main();

chmod +x grammar-checkを実行し、次のように文法をコンパイルします: pegjs your-grammar.peg grammar.jsその後、次のようにデプロイできます: grammar-check filename (filenameはチェックするファイルの場所です)。

いいね! より完全な例、@ jodevsaを作成していただきありがとうございます。 私は彼がJavaScriptを知っていると思っていました。

しかし、そういうことで、JavaScriptをまったく知らなくてもPEG.jsを使いたいと思うかもしれないという考えが浮かび上がります。 文法や入力ファイルを一般的に読み取って、ファイルや標準出力に出力できるプログラムを用意しておくと便利だと思います。

文法や入力ファイルを一般的に読み取って、ファイルや標準出力に出力できるプログラムを用意しておくと便利だと思います。

では、この問題を再開しませんか?

@mikeaustin @waldyriousおそらく、個別の「プログラム」を作成する代わりに、これはreadmeで言及できますか? そのようなことを実装する例で。

上記の作業例を自由に使用

おそらく、別の「プログラム」を作成する代わりに、これはreadmeで言及することができますか?

@mikeaustinのコメントは、別のプログラムがエンドユーザーにとって便利な利点を持っていることを示唆しており、私はそれに同意します。

@waldyriousこの問題は質問でした。 @ mikeaustinが提案した新しい問題を開きます。これは、0.11で実装された機能を確認する必要があります(問題のない単純な追加の場合)が、1.0にプッシュされる可能性があります(エラーが発生した場合は、後で整理するためにプッシュバックします)。 コマンドラインツールの書き直しが終わったら、実装は簡単なはずです。

申し訳ありません@ pepa65 @waldyriousは、今日の彼のコメントを投稿するまで、私も問題が存在していた知らなかった、以前の返信が、あなたと正直に言うとないため😆

このページは役に立ちましたか?
0 / 5 - 0 評価