Pegjs: كيف تنشره من سطر الأوامر؟

تم إنشاؤها على ٦ يونيو ٢٠١٧  ·  24تعليقات  ·  مصدر: pegjs/pegjs

لقد قمت بعمل ملف .peg (عبر الإنترنت) للتحقق من صحة. أود استخدامها في المنزل على سطر الأوامر. لقد قمت بتثبيت pegjs من مستودعات Ubuntu 16.04. أنشأت pegjs tldr.peg وأنتجت ملف tldr.js .

كيف يمكنني استخدام ذلك في سطر الأوامر؟ لدي ملفات أود التحقق منها.

question

التعليق الأكثر فائدة

تبدو جيدا! نشكرك على تقديم مثال أكثر اكتمالاً ،jodevsa. كنت أفترض أنه يعرف JavaScript.

لكن هذا النوع من التفكير يثير فكرة أن الناس قد يرغبون في استخدام PEG.js دون معرفة جافا سكريبت على الإطلاق. أعتقد أنه سيكون من السهل توفير برنامج يمكنه بشكل عام قراءة ملف القواعد والمدخلات ، والإخراج إلى ملف أو إخراج قياسي.

ال 24 كومينتر

لذا فأنت تريد إنشاء أداة سطر أوامر تستخدم ملف .peg الذي أنشأته والتحقق من صحة الملفات استنادًا إلى معلمة سطر الأوامر. هل انا على حق؟

على سبيل المثال:
validate_file ~/file.blah

@ pepa65

jodevsa هذا ما أحاول تحقيقه ..!

إن tldr.js الذي تم إنشاؤه هو مجرد مكتبة عامة يتم استدعاؤها بواسطة دالة التحليل ، يجب عليك كتابة برنامج يقوم بذلك!

1- اقرأ الملف
2- إرسال محتوى الملف إلى مكتبة tldr
3- نتيجة الإخراج؟

أنشأ PEG.js تعريف وظيفة المكتبة:

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

استخرج البيانات من الملف الذي تريده واستخدم المحلل اللغوي (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

  • إضافة موقع المجلد إلى $ path في ~ / .bashrc وإعادة تعيين المحطة

  • الآن يمكنك استخدامه على هذا النحو ، check_file ~ / file.txt

mikeaustin لا يبدو أنني ../lib/peg على الرغم من تثبيت node-pegjs (و 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 أستخدم العقدة فاستبدل كل من "let" و "const" بـ var

@ 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 مهما كان الأمر.

غريب ، جافا سكريبت لا تحتوي حتى على وظيفة "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 (حيث يكون اسم الملف هو موقع الملف المراد التحقق منه).

تبدو جيدا! نشكرك على تقديم مثال أكثر اكتمالاً ،jodevsa. كنت أفترض أنه يعرف JavaScript.

لكن هذا النوع من التفكير يثير فكرة أن الناس قد يرغبون في استخدام PEG.js دون معرفة جافا سكريبت على الإطلاق. أعتقد أنه سيكون من السهل توفير برنامج يمكنه بشكل عام قراءة ملف القواعد والمدخلات ، والإخراج إلى ملف أو إخراج قياسي.

أعتقد أنه سيكون من السهل توفير برنامج يمكنه بشكل عام قراءة ملف القواعد والمدخلات ، والإخراج إلى ملف أو إخراج قياسي.

فهل يعاد فتح هذا الموضوع اذن؟

mikeaustinwaldyrious ربما بدلا من جعل "برنامج" منفصل - وهذا يمكن أن يكون مجرد ذكرها في التمهيدي؟ مع مثال على تنفيذ مثل هذا الشيء.

لا تتردد في استخدام المثال العملي أعلاه ..!

ربما بدلاً من إنشاء "برنامج" منفصل - يمكن ذكر هذا فقط في الملف التمهيدي؟

يشير تعليق mikeaustin إلى أن البرنامج المنفصل له فائدة ملائمة للمستخدمين النهائيين ، وأنا أتفق مع ذلك.

waldyrious كانت هذه المشكلة عبارة عن سؤال ، سأفتح مشكلة جديدة لما اقترحه مشكلة يجب أن ترى الميزة

آسف @ pepa65 لعدم الرد مسبقًا ، ولكن لأكون صادقًا معك ، حتى نشر

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات