У меня есть этот грамматик:
grammar Cpl;
fragment A: ('A' | 'a');
fragment E: ('E' | 'e');
fragment M: ('M' | 'm');
fragment N: ('N' | 'n');
NAME: N A M E;
WHITESPACE: (' ' | '\t')+;
OPERATOR: '<' | '=' | '>';
DIGIT: '0' ..'9';
LETTER: ('a' ..'z' | 'A' ..'Z');
END: ';';
NEWLINE: ('\r'? '\n' | '\r')+;
WORD: LETTER (LETTER | DIGIT | '_')*;
name: NAME;
question: name OPERATOR|NAME;
command: question WORD END|question;
line: command EOF;
У меня есть форма с вводом.Я хочу, чтобы когда пользователь вводил «имя» и отправлял форму, я проверял имя и, если это правильно, предлагал operator
.
CplVisitor.js:
// Generated from .\Cpl.g4 by ANTLR 4.7.2
var antlr4 = require('antlr4/index');
function CplVisitor() {
antlr4.tree.ParseTreeVisitor.call(this);
return this;
}
CplVisitor.prototype = Object.create(antlr4.tree.ParseTreeVisitor.prototype);
CplVisitor.prototype.constructor = CplVisitor;
// Visit a parse tree produced by CplParser#name.
CplVisitor.prototype.visitName = function(ctx) {
return this.visitChildren(ctx);
};
// Visit a parse tree produced by CplParser#question.
CplVisitor.prototype.visitQuestion = function(ctx) {
return this.visitChildren(ctx);
};
// Visit a parse tree produced by CplParser#command.
CplVisitor.prototype.visitCommand = function(ctx) {
return this.visitChildren(ctx);
};
// Visit a parse tree produced by CplParser#line.
CplVisitor.prototype.visitLine = function(ctx) {
return this.visitChildren(ctx);
};
exports.CplVisitor = CplVisitor;
Я реализую этого посетителя:
HtmlCplVisitor.js:
// Generated from .\Cpl.g4 by ANTLR 4.7.2
var antlr4 = require('antlr4/index');
var CplVisitor = require('./CplVisitor').CplVisitor;
function HtmlCplVisitor() {
CplVisitor.call(this);
return this;
}
HtmlCplVisitor.prototype = Object.create(CplVisitor.prototype);
HtmlCplVisitor.prototype.constructor = HtmlCplVisitor;
// Visit a parse tree produced by CplParser#name.
HtmlCplVisitor.prototype.visitName = function(ctx) {
return this.visitChildren(ctx);
};
// Visit a parse tree produced by CplParser#question.
HtmlCplVisitor.prototype.visitQuestion = function(ctx) {
return this.visitChildren(ctx);
};
// Visit a parse tree produced by CplParser#command.
HtmlCplVisitor.prototype.visitCommand = function(ctx) {
return this.visitChildren(ctx);
};
// Visit a parse tree produced by CplParser#line.
CplVisitor.prototype.visitLine = function(ctx) {
return this.visitChildren(ctx);
};
exports.HtmlCplVisitor = HtmlCplVisitor;
Служить с помощью nodejs этого файла CplTest.js :
const http = require('http');
var express = require('express');
const antlr4 = require('antlr4/index');
const CplLexer = require('./CplLexer');
const CplParser = require('./CplParser');
const HtmlCplVisitor = require('./HtmlCplVisitor').HtmlCplVisitor;
const HtmlCplListener = require('./HtmlCplListener').HtmlCplListener;
var app = express();
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: true });
var server = app.listen(9999, function() {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at %s:%s Port', host, port);
});
var html =
'<body>' +
"<form action='/' method='post' name='form1'>" +
"Name:</p><input type= 'text' name='name'>" +
"<input type='submit' value='submit'>" +
'</form>' +
'</body>';
app.get('/', function(req, res) {
res.send(html);
});
app.post('/', urlencodedParser, function(req, res) {
var input = req.body.name;
var chars = new antlr4.InputStream(input);
var lexer = new CplLexer.CplLexer(chars);
var tokens = new antlr4.CommonTokenStream(lexer);
var parser = new CplParser.CplParser(tokens);
parser.buildParseTrees = true;
var tree = parser.name();
var visitor = HtmlCplVisitor.prototype.visit(tree);
res.send(html);
});
Как проверить, если name
вставлен, я возвращаю operators
массив клиенту для предложения.