- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
使用 antlr,我正在尝试为这样的树制作一个 TreeWalker:
输入:int x = 3
输出 AST:^(VARDEF int x 3)
我的解析器工作得很好并且还生成了一个如上所示的 AST,但是每当我想从 AST 解析任何东西时,比如 $variableType.text,在生成的 C# 2.0 TreeWalker 中总是有一个 NullReferenceException。
我的树行者:
tree grammar SGLTreeWalker;
options {
tokenVocab = SGL;
language = 'CSharp2';
}
[...]
compilationUnit
: (statement)+
;
statement
: variableDefinitionList
;
variableDefinitionList
: ^(VARDEF variableType variableName expression) { Console.WriteLine($variableType.text); }
;
[...]
由规则“variableDefinitionList”生成的有问题的部分如下所示:
Match(input, Token.UP, null);
Console.WriteLine(((variableType1 != null) ? input.TokenStream.ToString(
input.TreeAdaptor.GetTokenStartIndex(variableType1.Start),
input.TreeAdaptor.GetTokenStopIndex(variableType1.Start)) : null));
事实证明,input.TokenStream 为空,因此抛出 NullReferenceException。我读到如果使用的 TreeNodeStream 没有被缓冲就会发生这种情况,但我使用了 CommonTreeNodeStream 所以我认为它应该被缓冲。这是我用来提交 AST 的代码:
[...]
SGLParser parser = new SGLParser(tStream);
CommonTree t = (CommonTree) parser.compilationUnit().Tree;
Console.WriteLine("; " + t.ToStringTree());
CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
SGLTreeWalker tw = new SGLTreeWalker(treeStream);
tw.compilationUnit();
当我只想获取 $variableType.text
属性时,知道为什么 input.TokenStream 解析为 null 吗?
最佳答案
那是因为在树语法中,产生式规则返回一个 TreeRuleReturnScope
,它没有 text
属性(或 GetText()
方法)。
如果您想获取 variableType
规则的文本,您需要显式返回一个 string
。
演示:
grammar SGL;
options {
language=CSharp2;
output=AST;
}
tokens {
VARDEF;
}
@parser::namespace { SGL }
@lexer::namespace { SGL }
public compilationUnit
: statement+ EOF
;
statement
: variableDefinitionList
;
variableDefinitionList
: variableType variableName '=' expression
-> ^(VARDEF variableType variableName expression)
;
variableType
: Type
;
variableName
: ID
;
expression
: Int
;
Type
: 'int'
| 'double'
;
Int
: '0'..'9'+
;
ID
: ('a'..'z' | 'A'..'Z')+
;
Space
: ' ' {Skip();}
;
tree grammar SGLTreeWalker;
options {
tokenVocab=SGL;
language=CSharp2;
ASTLabelType=CommonTree;
}
@namespace { SGL }
compilationUnit
: statement+
;
statement
: variableDefinitionList
;
variableDefinitionList
: ^(VARDEF variableType variableName expression)
{Console.WriteLine($variableType.txt);}
;
variableType returns [string txt]
: Type {$txt = $Type.text;} // note that `Type` is still a normal token!
;
variableName
: ID
;
expression
: Int
;
类:
using System;
using Antlr.Runtime;
using Antlr.Runtime.Tree;
namespace SGL
{
public class Test
{
public static void Main (string[] args)
{
ANTLRStringStream Input = new ANTLRStringStream("int x = 3");
SGLLexer Lexer = new SGLLexer(Input);
CommonTokenStream Tokens = new CommonTokenStream(Lexer);
SGLParser parser = new SGLParser(Tokens);
CommonTree t = (CommonTree) parser.compilationUnit().Tree;
CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
SGLTreeWalker tw = new SGLTreeWalker(treeStream);
tw.compilationUnit();
}
}
}
产生以下输出:
int
关于c# - 为什么 input.TokenStream 解析为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6596808/
我有一个关于 lucene 标记化过程的基本问题: TokenStream tokenStream = analyzer.tokenStream(fieldName, reader); Term
给定一个字符串 (str),如何在 Rust 中将其转换为 TokenStream? 我试过使用 quote! 宏。 let str = "4"; let tokens = quote! { let
我有一个需要来自 token 流的字段;它不能用字符串实例化然后分析为标记。例如,我可能想将多个列(在我的 RDBMS 中)的数据组合到单个 Lucene 字段中,但我想以自己的方式分析每个列。因此,
问题 我目前正在开发一个使用 Lucene 8.1.0 的项目,纯 Lucene - 而不是 Solr。我想为根据用户查询显示的结果添加突出显示。我面临的问题是我无法找到获取指定文档上字段的 Toke
在应用程序中,我收到一个应用过滤器的文本,我想将此过滤结果存储到 lucene Document 对象中。我不关心原文。 String stringToProcess = "..."; TokenSt
我正在尝试了解 ANTLR4 token ,但我对 token 字符串表示有疑问。考虑以下简单语法: grammar Test; init: integer IDENTIFIER; integer:
我正在使用 Lucene 4.6,并且显然不清楚如何重用 TokenStream,因为我得到了异常: java.lang.IllegalStateException: TokenStream cont
我的问题既是语言实现问题,也是 ANTLR4 API 问题。 有什么办法可以修改 ParseTree 及其附带的 TokenStream 吗? 这是场景。我有一种定义数据流程序的简单语言。您可以在gi
我已经使用 antlr 4 创建了一个词法分析器来标记土耳其语自然语言文本,我需要做的是有一个标记流,我可以一个一个地获取标记。如果我像这样使用 CommonTokenStream 会返回一个列表:
我刚开始使用 Lucene,我觉得我一定对它有根本的误解,但是从示例和文档中我无法弄清楚这个问题。 我似乎无法让 Lucene 为使用 TokenStream 初始化的字段返回结果,而使用 strin
我编写了一个使用 ASCIIFoldingFilter 的自定义分析器,以便将位置名称中的扩展拉丁语集减少为常规拉丁语。 public class LocationNameAnalyzer exten
使用 antlr,我正在尝试为这样的树制作一个 TreeWalker: 输入:int x = 3 输出 AST:^(VARDEF int x 3) 我的解析器工作得很好并且还生成了一个如上所示的 AS
我正在尝试使用 Apache Lucene 进行标记,我对从 TokenStream 获取 token 的过程感到困惑。 最糟糕的是,我正在查看 JavaDocs 中解决我问题的评论。 http://
我使用 Lucene.NET3.0.3 如何获得 TermAttribute.I 尽我所能,但我无法获得 这里来源: Analyzer analyzer = new Lucene.Net.An
我正在尝试从 Python 序列构建 TokenStream。只是为了好玩,我希望能够将我自己的 token 直接传递给 pylucene.Field("MyField", MyTokenStream
我目前正在学习“The Definitive ANTLR 4 Reference”的“Building a Translator with a Listener”教程,但我正在使用 C# 并将示例翻译
我一直在考虑从 2.4 升级到 2.9,并注意到所有处理属性的人为代码。只是想知道是否有人有任何意见,考虑到它是 .9,这是否会改变,而当 3.0 出来时,事情会改变。 我很困惑如何通过反射创建属性并
使用 Appache Lucene TokenStream 去除停用词导致错误: TokenStream contract violation: reset()/close() call missin
我正在使用 Lucene 的功能来构建一种简单的方法来匹配文本中的相似单词。 我的想法是在我的文本上运行一个 Analyzer 以提供 TokenStream,并且对于每个 token ,我运行一个
由于各种原因,我必须使用最新版本的 Lucene API。 API 还没有很好的文档记录,所以我发现自己无法执行简单的 addDocument() 这里是Writer初始化: analyzer = n
我是一名优秀的程序员,十分优秀!