Ich habe eine .peg-Datei (online) erstellt, die validiert wird. Ich möchte in zu Hause auf der Kommandozeile verwenden. Ich habe pegjs aus den Ubuntu 16.04-Repos installiert. Ich habe pegjs tldr.peg
und es hat eine tldr.js
Datei erzeugt.
Wie verwende ich das auf der Kommandozeile? Ich habe Dateien, die ich überprüfen möchte.
Sie möchten also ein Befehlszeilentool erstellen, das die von Ihnen erstellte .peg verwendet und Dateien basierend auf einem Befehlszeilenparameter validiert. habe ich recht?
zum Beispiel:
validate_file ~/file.blah
@ pepa65
@jodevsa Das versuche ich zu erreichen..!
Die generierte tldr.js ist nur eine allgemeine Bibliothek, die von der Parse-Funktion aufgerufen wird. Sie müssen ein Programm schreiben, das dies tut!
1- Lesen Sie die Datei
2- Dateiinhalt an die tldr-Bibliothek senden
3- Ergebnis ausgeben ?
var parser=require('./tldr').parse;
extrahieren Sie Daten aus der gewünschten Datei und verwenden Sie parser(fileContent) !
Wenn Sie Node verwenden, ist hier ein konkreteres Beispiel:
#!/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));
});
}
Vielleicht wäre es hilfreich, eine App zu haben, die dies allgemeiner macht.
@mikeaustin Das ist
@pepa65 Schau
#!/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();
Legen Sie es in einen Ordner mit Ihrer tldr.js, sagen wir, Sie haben es check_file genannt
chmod +x check_file
Ordnerspeicherort zu $path in ~/.bashrc hinzufügen und Terminal zurücksetzen
jetzt können Sie es so verwenden, check_file ~/file.txt
@mikeaustin Ich scheine nicht ../lib/peg
, obwohl ich node-pegjs (und peg) installiert habe.
Was ich suche, ist ein generalisiertes Knotenskript, das ich wie folgt aufrufen könnte: peg-check tldr.pegjs file-to-be-checked
wobei tldr.pegjs die Ausgabe von pegjs tldr.peg tldr.pegjs
und file-to-be-checked
den geprüften Text enthält.
Oder, wenn pegjs optional ein Skript ausgeben könnte, das tldr.pegjs
, sodass pegjs tldr.peg -s tldr-check
ein Skript ausgeben würde, das wie folgt verwendet werden könnte: tldr-check file-to-be-checked
, das würde die Benutzerfreundlichkeit von pegjs erhöhen enorm für die Uneingeweihten..!
@jodevsa Danke!
ich habe
let output = parser(data);
^^^
SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
Also habe ich 'use strict';
hinzugefügt, aber dann habe ich:
const arguments = require('process').argv;
^^^^^^^^^
SyntaxError: Unexpected eval or arguments in strict mode
Ich schätze, mein Javascript-Fu ist nicht stark genug...
@pepa65 Ich habe den Code aktualisiert, überprüfe ihn noch einmal
mein Fehler :(
@pepa65 Ich verwende Knoten v 8.0.0, wenn ein anderer Fehler
@pepa65
NVM, probiere es einfach aus
#!/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
funktioniert hier gut. Der einzige Haken, den ich traf, war, dass tldr.js printf enthielt (das ich durch console.log ersetzt habe), aber dann funktioniert es!
Das einzige, was ich nicht verstehe, ist, dass es die Ausgabe mit undefined
egal was passiert.
seltsam, Javascript enthält nicht einmal eine "printf"-Funktion; noch ältere Versionen
Wenn du damit einverstanden bist, deine Grammatik öffentlich zu veröffentlichen, wäre es einfacher für mich, dir zu helfen
Oh, tut mir leid, als ich meinen Peg überprüfte, sah ich, dass ich fälschlicherweise { printf("OK");}
hinzugefügt hatte, also habe ich das geändert.
Aber es endet immer noch mit undefined. Meine Grammatik:
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 Das liegt daran, dass das laufende Skript, das @jodevsa Ihnen gegeben hat, das Ergebnis der Ausführung der Peg-Grammatik protokolliert; Da Ihre page
Regel der obersten Ebene mit einem console.log
endet, gibt die PEG undefined
an das ausgeführte Skript zurück.
Sie können entweder console.log(OK)
in return "OK";
ändern, das gedruckte undefined
ignorieren oder die Zeile console.log(output)
aus dem laufenden Skript entfernen.
Ich hoffe, das hilft!
@hawkrives :+1:
Richtig, dumm von mir. Macht es leichter! Ich denke, ich habe Dinge erreicht, bei denen ich weitermachen kann. Danke euch allen!
Ich denke, als Zusammenfassung für diejenigen, die hierher kommen, um nach der endgültigen Antwort zu suchen, verwenden Sie dieses Skript, nennen Sie es vielleicht 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();
Machen Sie chmod +x grammar-check
und kompilieren Sie Ihre Grammatik wie: pegjs your-grammar.peg grammar.js
und danach können Sie wie folgt implementieren: grammar-check filename
(wobei Dateiname der Speicherort der zu überprüfenden Datei ist).
Sieht gut aus! Danke für das vollständigere Beispiel, @jodevsa. Ich ging davon aus, dass er JavaScript kannte.
Aber das führt zu der Idee, dass Leute PEG.js verwenden möchten, ohne JavaScript zu kennen. Ich denke, es wäre praktisch, ein Programm bereitzustellen, das generisch eine Grammatik und eine Eingabedatei lesen und in eine Datei oder eine Standardausgabe ausgeben kann.
Ich denke, es wäre praktisch, ein Programm bereitzustellen, das generisch eine Grammatik und eine Eingabedatei lesen und in eine Datei oder eine Standardausgabe ausgeben kann.
Soll dieses Thema dann wieder aufgegriffen werden?
@mikeaustin @waldyrious vielleicht anstatt ein separates "Programm" zu machen - das kann nur in der Readme erwähnt werden? Mit einem Beispiel für die Umsetzung so etwas.
Fühlen Sie sich frei, das obige Arbeitsbeispiel zu verwenden..!
Vielleicht anstatt ein separates "Programm" zu erstellen - das kann nur in der Readme erwähnt werden?
Der Kommentar von
@waldyrious Dieses Problem war eine Frage, ich werde ein neues Problem für das eröffnen , was
Entschuldige @pepa65, dass geantwortet habe, aber um ehrlich zu sein, bis @waldyrious heute seinen Kommentar gepostet hat, wusste ich nicht einmal, dass das Problem existiert 😆
Hilfreichster Kommentar
Sieht gut aus! Danke für das vollständigere Beispiel, @jodevsa. Ich ging davon aus, dass er JavaScript kannte.
Aber das führt zu der Idee, dass Leute PEG.js verwenden möchten, ohne JavaScript zu kennen. Ich denke, es wäre praktisch, ein Programm bereitzustellen, das generisch eine Grammatik und eine Eingabedatei lesen und in eine Datei oder eine Standardausgabe ausgeben kann.