- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想做的是
通过语法阅读我的JavaScript代码
在每个函数的主体内编写特定的行。
对于。例如
输入
function(){
console.log('this is some function');
}
function somefunc (args){
console.log('this is some other function');
function(){
console.log('function inside a function');
}
}
function(){
//auto generated debug log
debug('some text');
console.log('this is some function');
}
function somefunc (args){
//auto generated debug log
debug('some text');
console.log('this is some other function');
function(){
//auto generated debug log
debug('some text');
console.log('function inside a function');
}
}
/* lexical grammar */
%lex
%%
\s+ /* skip whitespace */
"(" return '('
")" return ')'
<<EOF>> return 'EOF'
"function" return 'FUNCTION'
"{" return '{'
"}" return '}'
. return 'ANYTHING'
/lex
/* operator associations and precedence */
%start expr
%% /* language grammar */
expr: any EOF
{typeof console !== 'undefined' ? console.log($1) : print($1);
return $1;}
;
fun: FUNCTION '(' any ')' '{' any '}'
{$$=$1+$2+$3+$4+$5+'console.log(something)'+$6+$7}
;
any: ANYTHING
{$$=$1;}
| any ANYTHING
{$$=$1+$2}
| FUNCTION '(' any ')' '{' any '}'
{$$=$1+$2+$3+$4+$5+'console.log(something)'+$6+$7}
;
最佳答案
我的想法是仅专注于解析函数并忽略其他所有内容(即将它们转回)固有存在缺陷吗?
它不是天生的缺陷。实际上,这是一种常见的方法[注1]。但是,您的解决方案需要更多的工作。
首先,您需要使词法分析器更强大。它应该正确标识注释和字符串文字。否则,您可能会冒充匹配误报的风险:这些文字中隐藏着明显的标记。理想情况下,您还可以识别正则表达式,但这要复杂得多,因为它需要解析器的配合,而诸如您建议的那种简单化的解析器没有足够的上下文来区分正则表达式的开头和除法运算符。 [笔记2]
您还需要识别标识符。否则,碰巧包含字符function
(例如compare_function
)的标识符也将是错误的匹配项。
出现问题是因为any
不能包含FUNCTION
令牌。因此,如果您的扫描仪产生一个杂散的FUNCTION
令牌,则解析将失败。
另外,请记住,括号和括号不是ANYTHING
标记。由于程序通常会有许多括号和花括号,而这些括号和括号不是函数文字的一部分,因此您需要将它们添加到any
规则中。请注意,您不想将它们添加为单个令牌。而是需要添加括号平衡的序列(例如,'(' any ')'
)。否则,您将在'}'
上出现shift-reduce冲突。 (function(){ var a = { };...
:解析器如何知道}
不会关闭函数体?)
具有两个非终端可能会更简单,例如[注3]:
any: /* empty */ { $$ = ""; }
| any any_object { $$ = $1 + $2; }
;
any_object
: ANYTHING
| fun
| '(' any ')' { $$ = $1 + $2 + $3; }
| '{' any '}' { $$ = $1 + $2 + $3; }
;
return 42;
;
return42;
完全不同。)。您可能希望将空格识别为单独的标记,然后将其添加您的
any
规则(或上面的
any_object
规则),以及
fun
规则中
function
和
(
之间以及
)
和
{
之间的可选元素。 (由于空格将包含在
any
中,因此您不得在
any
非终结符旁边添加空格;这可能会导致reduce-reduce冲突。)
console.log(...)
语句后放置一个明确的分号。
function
。
function
替换
[f]unction
。第一个比较麻烦。您需要将
/(/
替换为
/\x28/
。
any
表示的混淆而出错。
any
的第三次生产不应与
fun
生产重复。相反,它应允许将
fun
添加到
any
序列中。 (也许您只是从该生产中遗漏了
any
。但是即使如此,当您仅可以使用非终端时,也无需重复
fun
生产。)
关于javascript - 编写野牛语法以识别javascript函数并忽略其他所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37209419/
我是一名优秀的程序员,十分优秀!