Pegjs: Wie wird es über die Befehlszeile bereitgestellt?

Erstellt am 6. Juni 2017  ·  24Kommentare  ·  Quelle: pegjs/pegjs

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.

question

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.

Alle 24 Kommentare

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 ?

Definition der von PEG.js generierten Bibliotheksfunktion:

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 😆

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Coffee2CodeNL picture Coffee2CodeNL  ·  13Kommentare

mattkanwisher picture mattkanwisher  ·  5Kommentare

mikeaustin picture mikeaustin  ·  7Kommentare

StoneCypher picture StoneCypher  ·  6Kommentare

audinue picture audinue  ·  13Kommentare