我目前在C#中使用ANTLR4,但我遇到了一个问题,我不知道如何获取对象/类IParseTree.
我在C#中找到了这里的完全限定名称Antlr4.Runtime.Tree.IParseTree但是如何获取对象?
AntlrInputStream inputStream = new AntlrInputStream(sSpinTexte);
SpinParserLexer SpinLexer = new SpinParserLexer(inputStream);
CommonTokenStream commonTokenStream = new CommonTokenStream(SpinLexer);
SpinParserParser SpinParser = new SpinParserParser(commonTokenStream);
IParseTree tree = ?????
Run Code Online (Sandbox Code Playgroud)
你能帮忙吗?
例如:
public static Domain.Recruitment.Recruitment Map(this Data.Recruitment dv)
{
//some code
return new Domain.Recruitment.Recruitment{}
}
Run Code Online (Sandbox Code Playgroud) 我想编写一个具有多种模式的词法分析器。但模式大多相似。唯一的区别是我用不同的名字引用了同一个字符。我让它工作了,问题是我必须复制整个词法分析器,更改所有名称,添加类型,并为每种模式添加一行。
这是我要解决的一般问题。我希望逗号在 '[' ']' 之外具有高优先级。我希望它有内部的优先级很低'[',']'。要做到这一点我推和弹出与模式'['和']'。但是因为我唯一改变的是优先级,所以我必须将所有规则复制到每个模式中并给它们不同的名称。
另外一件事,一旦进入 a'['就无法回到高优先级逗号。因此,当语法进入'{','}'部分时,逗号将恢复为高优先级。
为了实现这一点,我有初始默认模式加CONJUNCTION(高优先级)和NON_CONJUNCTION(低优先级)。我从默认模式复制所有规则并将它们重命名为C_或NC_。然后我将它们的类型分配回默认模式的类型。
我宁愿在不应对、重命名和为默认模式下的所有规则分配类型的情况下完成此操作。
这是我的词法分析器:
lexer grammar DabarLexer;
OPEN_PAREN : '(' -> pushMode(NON_CONJUNCTION) ;
CLOSE_PAREN : ')' -> popMode;
OPEN_BRACKET : '[' -> pushMode(NON_CONJUNCTION) ;
CLOSE_BRACKET : ']' -> popMode ;
OPEN_CURLY : '{' -> pushMode(CONJUNCTION) ;
CLOSE_CURLY : '}' -> popMode ;
SPACE : ' ' ;
HEAVY_COMMA : ',';
ENDLINE : …Run Code Online (Sandbox Code Playgroud) 我正在阅读明确的ANTLR4参考文献,并对其中一个例子有疑问(第76页):
STRING: '"' (ESC|.)*? '"';
fragment
ESC: '\\"' | '\\\\' ;
Run Code Online (Sandbox Code Playgroud)
该规则匹配典型的C++字符串 - 包含的char序列"",也可以包含\".
在我的期望中,规则STRING应该匹配可能的最小字符串,因为非贪婪的构造.所以,如果它看到\"它会映射\到.,并"以"在规则的结束,因为这会导致在最小的字符串可能.而不是这个,a \"映射到ESC.我有一个理解问题,因为它不是我所期望的.
这到底发生了什么?是这样的,分离的DFA (ESC|.)首先匹配,而另一个DFA匹配STRING使用已经匹配的(ESC|.)构造字符串?我不得不承认我还没读过这本书.
评论更新:
我需要通过自己的参数扩展linq-to-sql类,并且不想触及任何生成的类.欢迎任何更好的建议.但是如果linq-to-sql类正在改变,我也不想再次进行所有属性赋值.因此,如果vstudio为类生成新属性,我将自己的扩展属性保持独立,并且新的内部来自类本身
原始问题:
我不确定是否可能.我有一辆级轿车和一辆mycar从班级车延伸出来.mycar类也有一个字符串列表.唯一的区别.
如何将现在的任何汽车对象投射到mycar对象,而无需手动分配所有属性.喜欢:
Car car = new Car();
MyCar mcar = (MyCar) car;
Run Code Online (Sandbox Code Playgroud)
要么
MyCar mcar = new MyCar(car);
Run Code Online (Sandbox Code Playgroud)
或者我可以用自己的变量扩展汽车,而不必总是这样做
Car car = new Car();
MyCar mcar = new MyCar();
mcar.name = car.name;
mcar.xyz = car.xyz;
...
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有一个问题,我似乎无法绕过我的脑袋.我正在创建一个类来保存具有泛型类型的项的字典.InvariantCultureIgnoreCase 如果索引类型是字符串,则需要强制使用此字典.
例如:
public class Cache<TIndex, TItem>
{
protected IDictionary<TIndex, TItem> _cache { get; set; }
public Cache()
{
this._cache = new Dictionary<TIndex, TItem>();
}
public bool Exists(TIndex index)
{
if (!_cache.ContainsKey(index))
{
//....do other stuff here
this._cache.Add(databaseResult.Key, databaseResult.Value);
return false;
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
所以第一个问题是处理具有不同大小写的字符串; 我通过强制数据为大写来解决这个问题.然而,现在,我发现有一些特定于文化的角色,所以如果没有不变的文化切换,ContainsKey将返回false.
我试过创建一个新的IEqualityComparer,但永远不会被解雇.有任何想法吗?
我必须通过作业交上一些代码的硬拷贝.在Visual Studio 2010中是否有任何方法可以使用语法高亮显示打印C#源代码?
PS:作业是解决数学问题,因此语言选择并不重要,老师不需要编译和运行程序.她只想看看我们的方法和结果.
我有一个与Regexr.com一起使用的前瞻性Regex,但在.NET应用程序中使用它时却没有.
这是一些示例输入数据(请注意,我只是为了可读性而创建了行中断,文本实际上只是一个长行,因此需要一个正则表达式).
26. AUG\r\n2014\r\n27.08 Testing 1\r\n -100\r\n
20. AUG\r\n2014\r\n27.08 Testing 2\r\n -90\r\n
15. AUG\r\n2014\r\n27.08 Testing 3\r\n 200\r\n
9. AUG\r\n2014\r\n27.08 Testing 4\r\n 50\r\n
4. AUG\r\n2014\r\n27.08 Testing 5\r\n -200\r\n
25. JUL\r\n2014\r\n27.08 Testing 5\r\n -200\r\n
Run Code Online (Sandbox Code Playgroud)
使用以下正则表达式:
(.+?)(?=(\\r\\n\d{1,2}[.] [A-Z]{3})|$)
Run Code Online (Sandbox Code Playgroud)
,我希望捕获每一行,想要用"20. AUG"分隔它们等等.由于也应该捕获分隔符,我使用前瞻.Regexr.com上的一切都很棒,例如:http://regexr.com/39fd7
在.NET中执行此操作时:
Regex.Matches(input, "(.+?)(?=(\r\n\\d{1,2}[.] [A-Z]{3})|$)")
Run Code Online (Sandbox Code Playgroud)
我只得到这些结果:
-100
-90
200
50
-200
-200
Run Code Online (Sandbox Code Playgroud)
我尝试过各种RegexOptions,比如multiline和其他一些,但没有结果.
任何帮助或提示都非常感谢.谢谢
当访问者处理我的 ANTLR4 解析树时,有时我需要知道我的规则节点所在的父规则节点。在 的在线 API 文档中ParserRuleContext,我发现没有可以返回对象所表示的规则名称的方法/字段。我知道规则名称是子ParserRuleContext类名称的一部分,例如function_definition规则节点是 class Function_definitionContext。但要查询类名,我需要使用 Java 反射并手动Context在末尾删除字符串。
是否有更简单的方法来检索对象所代表的规则名称ParserRuleContext?
查询父规则节点的名称是一个常见的需求。例如,在处理 C++ 语法时,C++ 类声明可以位于全局范围、函数定义或另一个类声明中,这意味着规则节点class_declaration可以嵌套在global_scope,function_definition或class_declaration规则节点下。如果我只想隔离class_declaration下的那些节点global_scope,我需要查找父节点并确保它们不是function_definition或class_declaration。
所以我正在编写一个python解析器,我需要根据python语法规范动态生成INDENT和DEDENT令牌(因为python不使用显式分隔符).
基本上我有一堆表示缩进级别的整数.在INDENT令牌中的嵌入式Java操作中,我检查当前缩进级别是否高于堆栈顶部的级别; 如果是的话,我就推开它; 如果没有,我打电话skip().
问题是,如果当前缩进级别与堆栈中的多个级别匹配,我必须生成多个DEDENT令牌,而我无法弄清楚如何执行此操作.
我目前的代码:(注意within_indent_block并current_indent_level在其他地方管理)
fragment DENT: {within_indent_block}? (SPACE|TAB)+;
INDENT: {within_indent_block}? DENT
{if(current_indent_level > whitespace_stack.peek().intValue()){
whitespace_stack.push(new Integer(current_indent_level));
within_indent_block = false;
}else{
skip();
}
}
;
DEDENT: {within_indent_block}? DENT
{if(current_indent_level < whitespace_stack.peek().intValue()){
while(current_indent_level < whitespace_stack.peek().intValue()){
whitespace_stack.pop();
<<injectDedentToken()>>; //how do I do this
}
}else{
skip();
}
}
;
Run Code Online (Sandbox Code Playgroud)
我该怎么做和/或有更好的方法吗?