Antlr4/JS - 将什么放入 html 文件? (铅跟随图托)
Antlr4/JS - what to put in the html file ? (pb following the tuto)
我正在按照 page about JS target 中的示例进行操作:
我在测试站点上安装了 require.js 和 antrl4 运行时,按照解释编译了我的语法,准备了一个模仿 tuto 的小 html 文件。 (修复 之后缺失的部分)。
对于语法,我使用了 Expr.g4 of the book 的变体。
我修复了其中的一个错误,将其扩展为双打,将动作调整为 JS。
现在,我对 html 中的两件事感到困惑。
- js 评估在 var lexer = new grammarLexer.grammarLexer(chars); 处停止 。 js 控制台不显示正在调用的函数。顺便说一句,我什至不明白它怎么能猜到函数在文件 grammarLexer.ls 中。这里是不是缺少一些要求或文件声明?
- tuto 说我应该写一个访问者或听众,没有像我这样习惯了 Antrl2 的穷人的指导。但是我的语法中确实有 JS 动作,所以在这种情况下还不够吗? (可能 "your grammar comprises production code" 正是这个意思)。
(顺便说一句,如果我在我的 js 操作中有语法错误,尽管有异步调用,js 控制台是否会显示它?)
但首先,让第 1 点脱离 :-)
谢谢!
好的,教程中缺少一个关键信息:我确实需要先做
var grammarLexer =require('grammarLexer'), grammarParser =require('grammarParser');
(javascript 怎么能不抗议 new grammarLexer.grammarLexer() 而 class 未定义???)
现在是 parser.StartRule() 函数调用 return - 没有任何控制台消息。想法?
...知道了:我只需要一个名为 StartRule 的规则(显然我不需要侦听器)。
现在问题出在JS动作机制上:在java目标书中的Expr.g4中,@parser::members中定义了函数。例如:
@parser::members {
/** "memory" for our calculator; variable/value pairs go here */
Map<String, Integer> memory = new HashMap<String, Integer>();
int myeval(int left, int op, int right) {
switch ( op ) {
case MUL : return left * right;
case DIV : return left / right;
case ADD : return left + right;
case SUB : return left - right;
}
return 0;
}
}
规则中调用的是:
e returns [int v]
: a=e op=('*'|'/') b=e { $v = myeval($a.v, $op.type, $b.v); }
| a=e op=('+'|'-') b=e { $v = myeval($a.v, $op.type, $b.v); }
...
它非常适合 java。
但是,如果我将其翻译为 JS ( -> function myeval(left, op, right) ),则在评估规则时找不到该函数。
-> 那么,这应该如何适应在 JS 目标中工作呢?
(如果放入 @header 并用它们的值替换令牌,我可以丑陋地让它工作,但显然不是这样。至少它告诉我们这是最后一个问题)。
谢谢,
好的,现在问题已经改成了"scope of funcs and tokens in the actions; how to have the java examples working in JS",所以我关闭这个问题并。
我正在按照 page about JS target 中的示例进行操作: 我在测试站点上安装了 require.js 和 antrl4 运行时,按照解释编译了我的语法,准备了一个模仿 tuto 的小 html 文件。 (修复 之后缺失的部分)。
对于语法,我使用了 Expr.g4 of the book 的变体。 我修复了其中的一个错误,将其扩展为双打,将动作调整为 JS。
现在,我对 html 中的两件事感到困惑。
- js 评估在 var lexer = new grammarLexer.grammarLexer(chars); 处停止 。 js 控制台不显示正在调用的函数。顺便说一句,我什至不明白它怎么能猜到函数在文件 grammarLexer.ls 中。这里是不是缺少一些要求或文件声明?
- tuto 说我应该写一个访问者或听众,没有像我这样习惯了 Antrl2 的穷人的指导。但是我的语法中确实有 JS 动作,所以在这种情况下还不够吗? (可能 "your grammar comprises production code" 正是这个意思)。
(顺便说一句,如果我在我的 js 操作中有语法错误,尽管有异步调用,js 控制台是否会显示它?)
但首先,让第 1 点脱离 :-)
谢谢!
好的,教程中缺少一个关键信息:我确实需要先做 var grammarLexer =require('grammarLexer'), grammarParser =require('grammarParser'); (javascript 怎么能不抗议 new grammarLexer.grammarLexer() 而 class 未定义???)
现在是 parser.StartRule() 函数调用 return - 没有任何控制台消息。想法?
...知道了:我只需要一个名为 StartRule 的规则(显然我不需要侦听器)。
现在问题出在JS动作机制上:在java目标书中的Expr.g4中,@parser::members中定义了函数。例如:
@parser::members {
/** "memory" for our calculator; variable/value pairs go here */
Map<String, Integer> memory = new HashMap<String, Integer>();
int myeval(int left, int op, int right) {
switch ( op ) {
case MUL : return left * right;
case DIV : return left / right;
case ADD : return left + right;
case SUB : return left - right;
}
return 0;
}
}
规则中调用的是:
e returns [int v]
: a=e op=('*'|'/') b=e { $v = myeval($a.v, $op.type, $b.v); }
| a=e op=('+'|'-') b=e { $v = myeval($a.v, $op.type, $b.v); }
...
它非常适合 java。 但是,如果我将其翻译为 JS ( -> function myeval(left, op, right) ),则在评估规则时找不到该函数。 -> 那么,这应该如何适应在 JS 目标中工作呢? (如果放入 @header 并用它们的值替换令牌,我可以丑陋地让它工作,但显然不是这样。至少它告诉我们这是最后一个问题)。
谢谢,
好的,现在问题已经改成了"scope of funcs and tokens in the actions; how to have the java examples working in JS",所以我关闭这个问题并