我正在寻找"tokenizer","parser"和"lexer"是什么以及它们如何相互关联的明确定义(例如,解析器是否使用了tokenizer,反之亦然)?我需要创建一个程序,将通过c/h源文件来提取数据声明和定义.
我一直在寻找示例,可以找到一些信息,但我真的很难掌握语法规则,解析树和抽象语法树等基础概念以及它们如何相互关联.最终这些概念需要存储在实际程序中,但1)它们看起来像什么,2)是否有共同的实现.
我一直在关注这些主题和程序,如Lex和Yacc维基百科,但从未经历过编译器类(EE专业),我发现很难完全理解正在发生的事情.
我一直在阅读有关解释器/编译器如何工作的一些内容,而我感到困惑的一个领域是AST和CST之间的区别.我的理解是解析器生成一个CST,将它交给语义分析器,将其转换为AST.但是,我的理解是语义分析器只是确保遵循规则.我真的不明白为什么它会实际做出任何改变,使其变得抽象而不是具体.
有没有关于语义分析器的东西,或者AST和CST之间的差异有点人为?
parsing terminology abstract-syntax-tree semantic-analysis concrete-syntax-tree
我正在尝试捕获VBA评论.到目前为止,我有以下内容
'[^";]+\Z
Run Code Online (Sandbox Code Playgroud)
它捕获任何以单引号开头但在字符串结尾之前不包含任何双引号的内容.即它不匹配双引号字符串中的单引号.
dim s as string ' a string variable -- works
s = "the cat's hat" ' quote within string -- works
Run Code Online (Sandbox Code Playgroud)
但如果注释包含双引号字符串,则会失败
即
dim s as string ' string should be set to "ten"
Run Code Online (Sandbox Code Playgroud)
我怎样才能修复我的正则表达式呢?
grammar AdifyMapReducePredicate;
PREDICATE
: PREDICATE_BRANCH
| EXPRESSION
;
PREDICATE_BRANCH
: '(' PREDICATE (('&&' PREDICATE)+ | ('||' PREDICATE)+) ')'
;
EXPRESSION
: ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
Run Code Online (Sandbox Code Playgroud)
试图在ANTLRWorks 1.4中解释这一点,并收到以下错误:
[12:18:21] error(211): <notsaved>:1:8: [fatal] rule Tokens has non-LL(*) decision due to recursive rule invocations reachable from alts 1,2. Resolve by left-factoring or using syntactic predicates or using backtrack=true option.
[12:18:21] Interpreting...
Run Code Online (Sandbox Code Playgroud)
当我解释时,我试图解释一个预测,我的测试用例是(A || B)
我错过了什么?
我想从 java 源代码文件中删除所有类型的注释语句。例子:
String str1 = "SUM 10" /*This is a Comments */ ;
String str2 = "SUM 10"; //This is a Comments"
String str3 = "http://google.com"; /*This is a Comments*/
String str4 = "('file:///xghsghsh.html/')"; //Comments
String str5 = "{\"temperature\": {\"type\"}}"; //comments
Run Code Online (Sandbox Code Playgroud)
预期输出:
String str1 = "SUM 10";
String str2 = "SUM 10";
String str3 = "http://google.com";
String str4 = "('file:///xghsghsh.html/')";
String str5 = "{\"temperature\": {\"type\"}}";
Run Code Online (Sandbox Code Playgroud)
我使用下面的正则表达式来实现:
System.out.println(str1.replaceAll("[^:]//.*|/\\\\*((?!=*/)(?s:.))+\\\\*/", ""));
Run Code Online (Sandbox Code Playgroud)
这给了我 str4 和 str5 错误的结果。请帮我解决这个问题。
使用 Andreas 解决方案:
final String regex …Run Code Online (Sandbox Code Playgroud)