- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我计划在解析过程中包含文本元数据(如粗体、字体大小等)以实现更好的识别。
例如,我有一个给定的结构,其中一个词在它自己的行上 word/r/n
粗体 大小为 24px,是某篇文章的标题。为了得到更好的识别结果,我想把字符和元数据都考虑进去。就 ANTRL 而言,我不确定如何才能做到最好。我想做类似的事情:
我真的很喜欢选择选项1.,但我不确定我需要从 ANTLR 的哪一部分继承等。我必须从 ANTLRInputStream-Object
开始吗? ,以便为子类 Lexer 获取适当的流,为子类 Parser 获取自定义 Tokens 等等。有没有更优雅的方法,特别是在使用 {}
中的操作解析时查询 token 阻止?
如果有人有一些提示和/或经验,那就太好了!
编辑:
这是一个更具体的简单示例:我有一个文件,其中包含我正手解析的元数据编码。包括换行符在内的实际文本如下所示:
entryOne
Here is some content one.
entryTwo
Here is some content two.
凡标题entryOne
和 entryTwo
最初是 24 像素的字体大小,内容是 12 像素的字体大小(作为示例性给定值)。一个字符一个字符地创建一个自定义对象的新实例,将字符封装为 String 和 font-size。
我用字体大小的字段为每个字符初始化各自的对象,例如 entryOne
的第一个字母像 MyChar aTitelChar = new MyChar("e", 24);
对于内容,喜欢第二行Here is some content one.
我像这样创建 MyChar 的实例:
MyChar aContentChar= new MyChar("H", 12);
文本的所有字符都包裹在下面的实例中 MyChar
-Class 并添加到 List<MyChar>
以便为 ANTLR 产生新的输入。
下面是角色的 Java 类:
public class MyChar {
private int fontSizePx;
private String text;
public MyChar(String text, int fontSizePx) {
this.text = text;
this.fontSizePx = fontSizePx;
}
public int getFontSizePx() {
return fontSizePx;
}
public String getText() {
return text;
}
}
我希望我的语法与上述两个条目(或更多以这种方式格式化)相匹配,这两个条目依次包含一个标题和一个以句号结尾的内容。该语法可能如下所示:
rule: entry+ NEWLINE
;
entry:
title
content
;
title:
letters NEWLINE
;
content:
(letters)+ '.' NEWLINE
;
letters:
LETTERS
;
LETTERS:
('a'..'z' | 'A'..'Z')+
;
WS:
(' ' | '\t' | 'f' ) + {$channel = HIDDEN;};
NEWLINE:'\r'? '\n';
现在,例如,我想做的是通过检查包含title-token 在 titel
之前-规则返回。如果输入符合语法但实际上是某种错误(原始元数据编码文件以符合 title
规则的内容开头,但实际上是内容)语法的作者可以解决这个问题,如果他知道标题的原始 font-size 是 24 并检查它。如果其中一个 tokens 不等于 font-size 24,则抛出异常/不返回/做 smthg。合适的。
我正在考虑的是在哪里插入 List<MyChar>
提供此功能(在 ANTLR 上下文中解析时查询各种元数据)。我正在试验 ANTLR 的类,但由于我是 ANTLR 的新手,我想可能一些有经验的用户可以为我指明正确的方向,比如自定义对象的良好插入点在哪里?我应该从实现 CharStream
开始吗?并重写一些方法?可能 ANTLR 提供了一些我还没有找到的东西?
最佳答案
这是实现我认为您想要的目标的一种方法,即使用解析器来管理与元数据的匹配输入。请注意,我让空格很重要,因为它是内容的一部分,不能跳过。我还将句点作为内容的一部分来简化示例,而不是将它们用作标记。
SysEx.g
grammar SysEx;
@header {
import java.util.List;
}
@parser::members {
private List<MyChar> metadata;
private int curpos;
private boolean isTitleInput(String input) {
return isFontSizeInput(input, 24);
}
private boolean isContentInput(String input){
return isFontSizeInput(input, 12);
}
private boolean isFontSizeInput(String input, int fontSize){
List<MyChar> sublist = metadata.subList(curpos, curpos + input.length());
System.out.println(String.format("Testing metadata for input=\%s, font-size=\%d", input, fontSize));
int start = curpos;
//move our metadata pointer forward.
skipInput(input);
for (int i = 0, count = input.length(); i < count; ++i){
MyChar chardata = sublist.get(i);
char c = input.charAt(i);
if (chardata.getText().charAt(0) != c){
//This character doesn't match the metadata (ERROR!)
System.out.println(String.format("Content mismatch at metadata position \%d: metadata=(\%s,\%d); input=\%c", start + i, chardata.getText(), chardata.getFontSizePx(), c));
return false;
} else if (chardata.getFontSizePx() != fontSize){
//The font is wrong.
System.out.println(String.format("Format mismatch at metadata position \%d: metadata=(\%s,\%d); input=\%c", start + i, chardata.getText(), chardata.getFontSizePx(), c));
return false;
}
}
//All characters check out.
return true;
}
private void skipInput(String str){
curpos += str.length();
System.out.println("\t\tMoving metadata pointer ahead by " + str.length() + " to " + curpos);
}
}
rule[List<MyChar> metadata]
@init {
this.metadata = metadata;
}
: entry+ EOF
;
entry
: title content
{System.out.println("Finished reading entry.");}
;
title
: line {isTitleInput($line.text)}? newline {System.out.println("Finished reading title " + $line.text);}
;
content
: line {isContentInput($line.text)}? newline {System.out.println("Finished reading content " + $line.text);}
;
newline
: (NEWLINE{skipInput($NEWLINE.text);})+
;
line returns [String text]
@init {
StringBuilder builder = new StringBuilder();
}
@after {
$text = builder.toString();
}
: (ANY{builder.append($ANY.text);})+
;
NEWLINE:'\r'? '\n';
ANY: .; //whitespace can't be skipped because it's content.
title
是匹配标题元数据(24 号字体)后跟一个或多个换行符的行
。
content
是匹配内容元数据(12 号字体)后跟一个或多个换行符的行
。如上所述,为了简化,我删除了一段时间的检查。
行
是不包括换行符的字符序列。
A validating semantic predicate ({...}?
在 line
之后)用于验证该行是否与元数据匹配。
这是我用来测试语法的代码(为简洁起见,减去导入):
SysExGrammar.java
public class SysExGrammar {
public static void main(String[] args) throws Exception {
//Create some metadata that matches our input.
List<MyChar> matchingMetadata = new ArrayList<MyChar>();
appendMetadata(matchingMetadata, "entryOne\r\n", 24);
appendMetadata(matchingMetadata, "Here is some content one.\r\n", 12);
appendMetadata(matchingMetadata, "entryTwo\r\n", 24);
appendMetadata(matchingMetadata, "Here is some content two.\r\n", 12);
parseInput(matchingMetadata);
System.out.println("Finished example #1");
//Create some metadata that doesn't match our input (negative test).
List<MyChar> mismatchingMetadata = new ArrayList<MyChar>();
appendMetadata(mismatchingMetadata, "entryOne\r\n", 24);
appendMetadata(mismatchingMetadata, "Here is some content one.\r\n", 12);
appendMetadata(mismatchingMetadata, "entryTwo\r\n", 12); //content font size!
appendMetadata(mismatchingMetadata, "Here is some content two.\r\n", 12);
parseInput(mismatchingMetadata);
System.out.println("Finished example #2");
}
private static void parseInput(List<MyChar> metadata) throws Exception {
//Test setup
InputStream resource = SysExGrammar.class.getResourceAsStream("SysExTest.txt");
CharStream input = new ANTLRInputStream(resource);
resource.close();
SysExLexer lexer = new SysExLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
SysExParser parser = new SysExParser(tokens);
parser.rule(metadata);
System.out.println("Parsing encountered " + parser.getNumberOfSyntaxErrors() + " syntax errors");
}
private static void appendMetadata(List<MyChar> metadata, String string,
int fontSize) {
for (int i = 0, count = string.length(); i < count; ++i){
metadata.add(new MyChar(string.charAt(i) + "", fontSize));
}
}
}
SysExTest.txt(注意这使用 Windows 换行符 (\r\n
)
entryOne
Here is some content one.
entryTwo
Here is some content two.
测试输出(修剪;第二个示例有故意不匹配的元数据):
Parsing encountered 0 syntax errors
Finished example #1
Parsing encountered 2 syntax errors
Finished example #2
此解决方案要求每个 MyChar
对应于输入中的一个字符(包括换行符,尽管您可以根据需要删除该限制——如果我还没有,我会删除它这个答案写了 ;) )。
如您所见,可以将元数据绑定(bind)到解析器,一切都按预期进行。我希望这会有所帮助。
关于parsing - ANTLR 在词法分析/解析中包含元数据的最佳方式(自定义对象、注释类型),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13534218/
最终目标:我想要由 Git 跟踪的文件,但让这些文件对于所有分支都是相同的版本。如果您使用 gitignore 文件,则所有分支的文件都是相同的,但不幸的是不会被跟踪。当我跑 git push或类似的
我想从 PDF 文件中删除元数据。我已经尝试使用“exiftool”、“pdftk”和“qpdf”来删除元数据(建议的方法 - https://gist.github.com/hubgit/60783
AWS EC2 元数据从 EC2 提供了有关其自身的必要信息(废话!) - 是否有任何与 lambda 等效的信息。 我了解与 EC2 不同的 lambda 函数的 Multi-Tenancy 和短期
我正在使用 libavformat(即 C 库)将 MPEG4/H264 编码为 mp4 文件,我想在 MP4 文件中添加一些元数据,例如日期/时间。有人可以告诉我如何做到这一点吗? 谢谢。 最佳答案
有谁知道任何允许从 .jpg 图像中提取 java 元数据的类?或者可能是一些有用的代码? 谢谢! 最佳答案 我维护着一个库,正是这样做的。 https://github.com/drewnoakes
我尝试找出如何从媒体获取元数据有一段时间了,但到目前为止没有任何效果。我有类 Song,其中有 SimpleStringProperties,如标题、艺术家等。我尝试在类构造函数中为它们设置值: pr
我已经多次遇到这个问题,并且从不喜欢所选择的解决方案。假设您在数据库中有一个状态列表(作为一个简单的示例)。在您的代码隐藏中,您希望能够通过 ID 引用状态并通过 Intellisense 获得状态列
我在我的应用程序中使用 google 登录并从 google 获取用户个人资料信息。 我已经测试过,它在我这边工作正常,但苹果拒绝了它。我没有发现任何错误。 苹果拒绝原因:“Verify is you
我正在开发一个基于 MySQL 数据库的 Web 应用程序。我需要收集和分析使用情况和性能统计数据。统计数据将针对非技术人员。 如何实现此功能?您应该将我的问题视为编程问题,但如果您知道合适的工具或扩
我对如何保存表格行的元数据有疑问。 例如,我有一个表,其中包含有关图像 items_images 的数据。编号,整数(20)标题,VARCHAR(255)添加日期,DATETIME... 现在我想添加
我不明白为什么我必须在 list 中使用两个元数据元素才能开始运行我的 Google Maps API v2 项目。这些标签的用途是什么? 最佳答案 元数据是指有关数据的数据。 关于java -
如何获取 SharePoint 文档库中项目的内容类型列或元数据? 此链接提供了我不需要的文件属性 http://msdn.microsoft.com/en-us/library/microsoft.
我很确定这是可能的,只是不确定它的术语是什么以及如何去做。基本上,如果您右键单击任何文件并转到属性,然后转到摘要,您可以向文件添加评论等。 我想知道的是,您将如何从 C# 中有问题地执行此操作。此外,
在我的应用程序中,我正在从 Assets 库中检索 UIImage,该图像具有元数据。然后,该应用程序会调整图像大小并旋转图像,从而创建新图像。新图像没有预期的原始元数据,但如何在上传前将元数据添加回
Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信息。
想知道是否有人知道扩展或配置 Breeze 以便服务器返回实体元数据中的附加信息的任何方法?我想使用这些附加数据来协助验证。 假设我有一个应用了一些数据注释的实体模型: public class Pe
我正在寻找将 MEF 用于我正在构建的应用程序的插件系统。我希望每个组件在(GUID)上都有一个我希望能够查找的标识符。但是,此 ID 在处理导出部件时也很有用。 有没有一种方法可以让我在导出的部分上
我对不完整的视频有疑问。例如上传失败的视频。如果您使用 ffmpeg -i 检查其元数据您将获得 1 小时的持续时间,但实际上只有 10mb 已上传到服务器,实际持续时间约为 7 分钟。查找这些视频
我在使用 FFmpeg 覆盖视频文件上的元数据时遇到了一些问题,这些文件之前已经添加了元数据(FFmpeg 也添加了以前的元数据)。 所以我使用ffmpeg -i path/to/video file
我有两个项目组想要加入: A B 使用常规连接会给我一个包含 4 个项目的集合: ServerA with Metadata A; ServerB with Metad
我是一名优秀的程序员,十分优秀!