Java 使用Scanner/Parser/Lexer进行脚本排序
我正在开发一个用Java实现的JavaScript collator/compositor。它是可行的,但必须有更好的方法来实现它,我认为Lexer可能是前进的方向,但我有点模糊 我已经为合成器开发了一个元语法,它是JavaScript语言的一个子集。就典型的JavaScript解释器而言,合成器元语法是合法的,只是不起作用(我使用同义词作为保留字的标签,后跟合成器应该解释的代码块)。现在,我正在使用scanner和regex查找源文件中的元语法,然后在检测合法表达式的基础上进行浅层词法转换 重写的javascript和扫描器/解析器之间存在着紧密的耦合,我对此并不满意,因为重写的javascript使用了专门为此编写的对象支持库的功能,并且该库可能会发生更改 我希望我可以在Backaus Naur或EBNF中声明元语法,将其提供给lexer(ANTRL?),并根据在源文件中检测到的元语法表达式,将合成器定向到某些操作,例如将所需脚本前置到另一个脚本,声明变量,为适当参数化的库函数调用生成文本,甚至压缩脚本 这是制作合成器的合适方法吗?我是否应该使用Scanner/Parser/Lexer方法来合成JavaScript?感谢您的反馈-我不太确定从哪里开始:) 更新: 下面是一个更具体的示例-使用元语法的示例对象声明:Java 使用Scanner/Parser/Lexer进行脚本排序,java,javascript,parsing,lexer,Java,Javascript,Parsing,Lexer,我正在开发一个用Java实现的JavaScript collator/compositor。它是可行的,但必须有更好的方法来实现它,我认为Lexer可能是前进的方向,但我有点模糊 我已经为合成器开发了一个元语法,它是JavaScript语言的一个子集。就典型的JavaScript解释器而言,合成器元语法是合法的,只是不起作用(我使用同义词作为保留字的标签,后跟合成器应该解释的代码块)。现在,我正在使用scanner和regex查找源文件中的元语法,然后在检测合法表达式的基础上进行浅层词法转换 重
namespace: ie.ondevice
{
use: ie.ondevice.lang.Mixin;
use: ie.ondevice.TraitsDeclaration;
declare: Example < Mixin | TraitsDeclaration
{
include: "path/to/file.extension";
// implementation here
}
}
也许我在过度设计我的需求,但我真正想要的是一个事件驱动的collator——监听器可以松散地耦合到指令检测。是的,使用解析器生成器(like)是IMO的一种方式。如果您提供一个更具体的示例,说明您试图解析的内容,可能是我(或其他人)我可以进一步帮助你 从一开始就创造了一些好的开始 编辑: 举个例子:
namespace: ie.ondevice
{
use: ie.ondevice.lang.Mixin;
use: ie.ondevice.TraitsDeclaration;
declare: Example < Mixin | TraitsDeclaration
{
include: "path/to/file.extension";
// implementation here
}
}
将上述内容存储在名为FJS.g
的文件ANTLR中,并让它生成您的lexer&parser,如下所示:
java -cp antlr-3.2.jar org.antlr.Tool FJS.g
要测试它,请运行以下命令:
public class ANTLRDemo {
public static void main(String[] args) throws Exception {
String source =
"namespace: ie.ondevice \n"+
"{ \n"+
" use: ie.ondevice.lang.Mixin; \n"+
" use: ie.ondevice.TraitsDeclaration; \n"+
" \n"+
" declare: Example < Mixin | TraitsDeclaration \n"+
" { \n"+
" include: \"path/to/file.extension\"; \n"+
" // implementation here \n"+
" } \n"+
"} ";
ANTLRStringStream in = new ANTLRStringStream(source);
CommonTokenStream tokens = new CommonTokenStream(new FJSLexer(in));
FJSParser parser = new FJSParser(tokens);
parser.parse();
System.out.println(parser.obj);
}
}
现在您可以让FJSObject
类生成/重写元/源文件。从该类中,您还可以执行检查以查看包含的文件是否实际存在
HTH.是的,使用parser generator(like)是IMO的一种方式。如果您提供一个更具体的示例,说明您试图解析的内容,也许我(或其他人)可以进一步帮助您 从一开始就创造了一些好的开始 编辑: 举个例子:
namespace: ie.ondevice
{
use: ie.ondevice.lang.Mixin;
use: ie.ondevice.TraitsDeclaration;
declare: Example < Mixin | TraitsDeclaration
{
include: "path/to/file.extension";
// implementation here
}
}
将上述内容存储在名为FJS.g
的文件ANTLR中,并让它生成您的lexer&parser,如下所示:
java -cp antlr-3.2.jar org.antlr.Tool FJS.g
要测试它,请运行以下命令:
public class ANTLRDemo {
public static void main(String[] args) throws Exception {
String source =
"namespace: ie.ondevice \n"+
"{ \n"+
" use: ie.ondevice.lang.Mixin; \n"+
" use: ie.ondevice.TraitsDeclaration; \n"+
" \n"+
" declare: Example < Mixin | TraitsDeclaration \n"+
" { \n"+
" include: \"path/to/file.extension\"; \n"+
" // implementation here \n"+
" } \n"+
"} ";
ANTLRStringStream in = new ANTLRStringStream(source);
CommonTokenStream tokens = new CommonTokenStream(new FJSLexer(in));
FJSParser parser = new FJSParser(tokens);
parser.parse();
System.out.println(parser.obj);
}
}
现在您可以让FJSObject
类生成/重写元/源文件。从该类中,您还可以执行检查以查看包含的文件是否实际存在
HTH.您可能希望了解该项目——这是一个在JVM上运行JavaScript的完整解决方案,但解析JavaScript代码的代码已被很好地封装,可以在没有完整执行功能的情况下使用。您可能希望了解该项目——这是一个在JVM上运行JavaScript的完整解决方案,但是解析JavaScript代码的代码被很好地封装,可以在没有完整执行功能的情况下使用。@Bart-感谢链接-我已经更新了帖子,对您的反馈非常感兴趣@Bart-我被说服了-这对我来说澄清了很多-特别是委托Java实例为我编写代码的策略-我期待着对此进行测试。我想问题已经解决了!没问题,孩子。如果您需要任何澄清,请告诉我。@Bart-谢谢您的链接-我已经更新了帖子,对您的反馈非常感兴趣@Bart-我被说服了-这对我来说澄清了很多-特别是委托Java实例为我编写代码的策略-我期待着对此进行测试。我想问题已经解决了!没问题,孩子。如果您需要任何澄清,请告诉我。我曾认为这是一种抽象的可能性,但我不确定我是否可以使用Rhino来整理javascript-AFAIK Rhino只能将javascript编译为Java-您知道原则上Rhino如何被用作可编程脚本压缩程序吗?我曾认为这是一种抽象的可能性,但是我不确定我是否可以使用Rhino来整理javascript——AFAIK Rhino只能将javascript编译成Java——你知道原则上Rhino如何被用作可编程脚本压缩程序吗?
public class ANTLRDemo {
public static void main(String[] args) throws Exception {
String source =
"namespace: ie.ondevice \n"+
"{ \n"+
" use: ie.ondevice.lang.Mixin; \n"+
" use: ie.ondevice.TraitsDeclaration; \n"+
" \n"+
" declare: Example < Mixin | TraitsDeclaration \n"+
" { \n"+
" include: \"path/to/file.extension\"; \n"+
" // implementation here \n"+
" } \n"+
"} ";
ANTLRStringStream in = new ANTLRStringStream(source);
CommonTokenStream tokens = new CommonTokenStream(new FJSLexer(in));
FJSParser parser = new FJSParser(tokens);
parser.parse();
System.out.println(parser.obj);
}
}
name : Example
namespace : ie.ondevice
inherit : Mixin
resemble : [TraitsDeclaration]
use : [ie.ondevice.lang.Mixin, ie.ondevice.TraitsDeclaration]
include : ["path/to/file.extension"]