AngularJS webapp中的Peg.js
我有一个AngularJS web应用程序 我想在我的应用程序中使用peg.js。 我刚刚编写了一个peg.js语法:CriteriaValue.pegjs,并使用命令行生成了解析器: pegjs CriteriaValue.pegjs,生成CriteriaValue.js 有人能给我解释一下如何使用解析器吗 var result=parser.parse('my string');不起作用 我创建了一个plunker: 简短回答AngularJS webapp中的Peg.js,angularjs,pegjs,Angularjs,Pegjs,我有一个AngularJS web应用程序 我想在我的应用程序中使用peg.js。 我刚刚编写了一个peg.js语法:CriteriaValue.pegjs,并使用命令行生成了解析器: pegjs CriteriaValue.pegjs,生成CriteriaValue.js 有人能给我解释一下如何使用解析器吗 var result=parser.parse('my string');不起作用 我创建了一个plunker: 简短回答 在CriteriaValue.js中,将第一行中的module
- 在CriteriaValue.js中,将第一行中的
导出到module.exports
parser
- 在index.html中,交换
标记,使CriteriaValue.js排在第一位 - (可选)在script.js中,将解析结果输出为格式化的JSON字符串,以便查看实际值
ReferenceError:找不到变量:解析器(script.js:3)
ReferenceError:找不到变量:error(CriteriaValue.js:1)
解析器
对象
查看CriteriaValue.js,您可以看到它实际上是将生成的解析器对象分配给一个不存在的模块。这是PEG.js的默认行为,因为它假设您要将解析器用于node.js。您看到错误的原因是没有模块
对象,因此我们无法分配给这个不存在的对象的导出
属性。将赋值更改为parser
,这是我们可以赋值的(因为PEG.js不使用),可以避免此错误,并使parser
可在script.js中使用
最后,需要先创建解析器,然后script.js才能使用它;因此,
交换的原因就是如此
对于CriteriaValue.js的未来创建,请执行以下操作:
pegjs --export-var parser CriteriaValue.pegjs
这将生成文件,以便将对象分配给变量parser
,而不是module.exports
AngularJS在哪里
正如@dirkk在评论中所说的,将解析器定义为全局变量是不好的做法,当然不是AngularJS的方式,即将解析器实现为服务
实现这一点的最快(但不一定是最好的)方法是使用已经生成的CriteriaValue.js代码并围绕它包装一个服务。e、 g:
angular.module('yourApp.services', [])
.factory('Parser', function() {
// The generated code, except replace "parser = " with "return "
});
另一个选项是获取.pegjs文件并使用PEG.buildParser()
在客户端生成解析器:
这使得更新语法变得更容易,因为您不必每次都重写服务,但会增加加载应用程序的延迟。这种方法的可行性取决于你的语法有多复杂&它实际需要改变的频率有多高
不管您如何构建解析器,您不一定需要将生成的解析器对象直接公开给Angular应用程序的其余部分。相反,您可以为您的应用程序使用此解析器实际执行的操作实现更高级别的API(例如,validate(input)
,getAST(input)
,等等)。这样,如果您将来决定切换到另一个解析器(例如Jison),那么您需要更改的代码将少得多。简短回答
- 在CriteriaValue.js中,将第一行中的
module.exports
导出到parser
- 在index.html中,交换
标记,使CriteriaValue.js排在第一位
- (可选)在script.js中,将解析结果输出为格式化的JSON字符串,以便查看实际值
这是普朗克:
长话短说
运行原始plunker并检查控制台日志;您将注意到两个错误:
ReferenceError:找不到变量:解析器(script.js:3)
ReferenceError:找不到变量:error(CriteriaValue.js:1)
第一个错误是由于在全局范围内,script.js或CriteriaValue.js从未创建任何解析器
对象
查看CriteriaValue.js,您可以看到它实际上是将生成的解析器对象分配给一个不存在的模块。这是PEG.js的默认行为,因为它假设您要将解析器用于node.js。您看到错误的原因是没有模块
对象,因此我们无法分配给这个不存在的对象的导出
属性。将赋值更改为parser
,这是我们可以赋值的(因为PEG.js不使用),可以避免此错误,并使parser
可在script.js中使用
最后,需要先创建解析器,然后script.js才能使用它;因此,
交换的原因就是如此
对于CriteriaValue.js的未来创建,请执行以下操作:
pegjs --export-var parser CriteriaValue.pegjs
这将生成文件,以便将对象分配给变量parser
,而不是module.exports
AngularJS在哪里
正如@dirkk在评论中所说的,将解析器定义为全局变量是不好的做法,当然不是AngularJS的方式,即将解析器实现为服务
实现这一点的最快(但不一定是最好的)方法是使用已经生成的CriteriaValue.js代码并围绕它包装一个服务。e、 g:
angular.module('yourApp.services', [])
.factory('Parser', function() {
// The generated code, except replace "parser = " with "return "
});
另一个选项是获取.pegjs文件并使用PEG.buildParser()
在客户端生成解析器:
这使得更新语法变得更容易,因为您不必每次都重写服务,但会增加加载应用程序的延迟。这种方法的可行性取决于你的语法有多复杂&它实际需要改变的频率有多高
不管您如何构建解析器,您不一定需要将生成的解析器对象直接公开给Angular应用程序的其余部分。相反,您可以实现更高级别的