لقد قمت بعمل ملف .peg (عبر الإنترنت) للتحقق من صحة. أود استخدامها في المنزل على سطر الأوامر. لقد قمت بتثبيت pegjs من مستودعات Ubuntu 16.04. أنشأت pegjs tldr.peg
وأنتجت ملف tldr.js
.
كيف يمكنني استخدام ذلك في سطر الأوامر؟ لدي ملفات أود التحقق منها.
لذا فأنت تريد إنشاء أداة سطر أوامر تستخدم ملف .peg الذي أنشأته والتحقق من صحة الملفات استنادًا إلى معلمة سطر الأوامر. هل انا على حق؟
على سبيل المثال:
validate_file ~/file.blah
@ pepa65
jodevsa هذا ما أحاول تحقيقه ..!
إن tldr.js الذي تم إنشاؤه هو مجرد مكتبة عامة يتم استدعاؤها بواسطة دالة التحليل ، يجب عليك كتابة برنامج يقوم بذلك!
1- اقرأ الملف
2- إرسال محتوى الملف إلى مكتبة tldr
3- نتيجة الإخراج؟
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 لعدم الرد مسبقًا ، ولكن لأكون صادقًا معك ، حتى نشر
التعليق الأكثر فائدة
تبدو جيدا! نشكرك على تقديم مثال أكثر اكتمالاً ،jodevsa. كنت أفترض أنه يعرف JavaScript.
لكن هذا النوع من التفكير يثير فكرة أن الناس قد يرغبون في استخدام PEG.js دون معرفة جافا سكريبت على الإطلاق. أعتقد أنه سيكون من السهل توفير برنامج يمكنه بشكل عام قراءة ملف القواعد والمدخلات ، والإخراج إلى ملف أو إخراج قياسي.