Pegjs: Bagaimana cara menyebarkannya dari commandline?

Dibuat pada 6 Jun 2017  ·  24Komentar  ·  Sumber: pegjs/pegjs

Saya membuat file .peg (online) yang memvalidasi. Saya ingin menggunakan di rumah pada baris perintah. Saya menginstal pegjs dari repo Ubuntu 16.04. Saya melakukan pegjs tldr.peg dan itu menghasilkan file tldr.js .

Bagaimana cara menggunakannya di commandline? Saya memiliki file yang ingin saya periksa.

question

Komentar yang paling membantu

Kelihatan bagus! Terima kasih telah membuat contoh yang lebih lengkap, @jodevsa. Saya berasumsi dia tahu JavaScript.

Namun hal semacam itu memunculkan gagasan bahwa orang mungkin ingin menggunakan PEG.js bahkan tanpa mengetahui JavaScript sama sekali. Saya pikir akan berguna untuk menyediakan program yang secara umum dapat membaca tata bahasa dan file input, dan output ke file atau output standar.

Semua 24 komentar

Jadi, Anda ingin membuat alat baris perintah yang menggunakan .peg yang Anda buat dan memvalidasi file berdasarkan parameter baris perintah. Apakah saya benar?

untuk contoh:
validate_file ~/file.blah

@pepa65

@jodevsa Itulah yang saya coba capai..!

tldr.js yang dihasilkan hanyalah perpustakaan umum yang dipanggil oleh fungsi parse, Anda harus menulis program yang melakukan ini!

1- baca filenya
2- kirim konten file ke perpustakaan tldr
3- hasil keluaran?

Definisi fungsi perpustakaan yang dihasilkan PEG.js:

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

ekstrak data dari file yang Anda inginkan dan gunakan parser(fileContent) !

Jika Anda menggunakan Node, berikut adalah contoh yang lebih konkret:

#!/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));
  });
}

Mungkin akan sangat membantu untuk memiliki aplikasi yang melakukan itu secara lebih umum.

@mikeaustin Jelas ini bukan cara termudah baginya untuk memahami apa yang Anda lakukan
@pepa65 Lihat ini:

#!/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();

  • letakkan di folder dengan tldr.js Anda katakanlah Anda menamakannya check_file

  • chmod +x check_file

  • tambahkan lokasi folder ke $path di ~/.bashrc dan setel ulang terminal

  • sekarang Anda dapat menggunakannya seperti ini, check_file ~/file.txt

@mikeaustin Sepertinya saya tidak memiliki ../lib/peg meskipun saya telah menginstal node-pegjs (dan pasak).

Apa yang saya cari adalah skrip simpul umum yang dapat saya panggil seperti: peg-check tldr.pegjs file-to-be-checked mana tldr.pegjs adalah output dari pegjs tldr.peg tldr.pegjs dan file-to-be-checked berisi teks yang sedang diperiksa.

Atau, jika pegjs secara opsional dapat menampilkan skrip yang menyertakan tldr.pegjs , sehingga pegjs tldr.peg -s tldr-check akan menampilkan skrip yang dapat digunakan seperti: tldr-check file-to-be-checked , yang akan meningkatkan kegunaan pegjs sangat untuk yang belum tahu..!

@jodevsa Terima kasih!
saya mendapatkan

let output = parser(data);
            ^^^

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

Jadi saya menambahkan 'use strict'; , tetapi kemudian saya mendapatkan:

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

SyntaxError: Unexpected eval or arguments in strict mode

Saya kira javascript-fu saya tidak cukup kuat ...

@pepa65 saya memperbarui kode, periksa lagi
salahku :(

@pepa65 saya menggunakan node v 8.0.0 , jika kesalahan lain muncul, ganti saja setiap "biarkan" dan "const" dengan var

@pepa65
NVM, coba saja ini

#!/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 berfungsi dengan baik di sini. Satu-satunya hambatan yang saya tekan adalah tldr.js berisi printf (yang saya ganti dengan console.log), tetapi kemudian berhasil!
Satu-satunya hal yang saya tidak mengerti bahwa itu mengakhiri output dengan undefined tidak peduli apa.

aneh, javascript bahkan tidak mengandung fungsi "printf"; bahkan versi yang lebih lama
jika Anda setuju dengan memposting tata bahasa Anda ke publik, akan lebih mudah bagi saya untuk membantu

O, maaf, meninjau pasak saya, saya melihat bahwa saya telah salah menambahkan { printf("OK");} , jadi saya mengubahnya.
Tapi itu masih berakhir dengan tidak terdefinisi. tata bahasa saya:

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 Itu karena skrip berjalan yang diberikan @jodevsa kepada Anda mencatat hasil menjalankan tata bahasa pasak; karena aturan page tingkat atas Anda diakhiri dengan console.log , PEG akan mengembalikan undefined ke skrip yang sedang berjalan.

Anda dapat mengubah console.log(OK) menjadi return "OK"; , mengabaikan undefined yang dicetak, atau menghapus baris console.log(output) dari skrip yang sedang berjalan.

Semoga membantu!

@hawkrives :+1:

Benar, bodohnya aku. Membuatnya lebih mudah! Saya pikir saya mendapatkan hal-hal di mana saya dapat melanjutkan. Terima kasih semua!

Saya kira, sebagai ringkasan bagi mereka yang datang ke sini mencari jawaban akhir, gunakan skrip ini, mungkin menyebutnya 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();

Lakukan chmod +x grammar-check dan kompilasi tata bahasa Anda seperti: pegjs your-grammar.peg grammar.js dan setelah itu Anda dapat menggunakan seperti: grammar-check filename (di mana nama file adalah lokasi file yang akan diperiksa).

Kelihatan bagus! Terima kasih telah membuat contoh yang lebih lengkap, @jodevsa. Saya berasumsi dia tahu JavaScript.

Namun hal semacam itu memunculkan gagasan bahwa orang mungkin ingin menggunakan PEG.js bahkan tanpa mengetahui JavaScript sama sekali. Saya pikir akan berguna untuk menyediakan program yang secara umum dapat membaca tata bahasa dan file input, dan output ke file atau output standar.

Saya pikir akan berguna untuk menyediakan program yang secara umum dapat membaca tata bahasa dan file input, dan output ke file atau output standar.

Apakah masalah ini akan dibuka kembali?

@mikeaustin @waldyrious mungkin alih-alih membuat "program" terpisah - ini bisa disebutkan di readme? Dengan contoh penerapan hal seperti itu.

Jangan ragu untuk menggunakan contoh kerja di atas ..!

mungkin alih-alih membuat "program" terpisah - ini bisa disebutkan di readme?

Komentar @mikeaustin menunjukkan bahwa program terpisah memang memiliki manfaat kenyamanan bagi pengguna akhir, dan saya setuju dengan itu.

@waldyrious Masalah ini adalah pertanyaan, saya akan membuka masalah baru untuk apa yang disarankan @mikeaustin , yang akan melihat fitur diimplementasikan untuk 0,11 (jika itu tambahan sederhana tanpa masalah), tetapi mungkin didorong ke 1,0 ( jika itu menimbulkan beberapa kesalahan, saya akan mendorongnya kembali untuk menyelesaikannya nanti). Seharusnya sederhana untuk diterapkan setelah saya selesai dengan penulisan ulang alat baris perintah.

Maaf @pepa65 karena tidak membalas sebelumnya, tetapi jujur ​​​​dengan Anda, sampai @waldyrious memposting komentarnya hari ini, saya bahkan tidak tahu ada masalah

Apakah halaman ini membantu?
0 / 5 - 0 peringkat