- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在开发我们的小 DSL 方面取得了一些进展,但在尝试突出显示我们正在使用的 TextEditorControl 中的注释时遇到了问题。顺便说一下,ICSharpCode 控件非常棒,它与 ANTLR 相结合,为 DSL 提供了一个很好的平台。
我有一个工作语法和词法分析器,并在文本编辑器中编写了一个突出显示策略,它也运行良好。 DSL 中唯一拒绝正确着色的元素是我在隐藏 channel 上的“评论”。
Comment
: '//' ~('\r' | '\n')* {$channel=Hidden;}
| '/*' .* '*/' {$channel=Hidden;}
;
//Comment
abc=[7,8,9];
return abc[2];
private void MarkUsingParalexTokens(IDocument document, LineSegment line)
{
var text = document.GetText(line).ToLower();
var input = new ANTLRStringStream(text);
_lexer.CharStream = input;
_tokens = new CommonTokenStream(_lexer, BaseRecognizer.Hidden);
//_tokens.TokenSource =_lexer;
var wordStart = 0;
if (_tokens.Count > 1)
{
do
{
_tokens.Consume();
} while (_tokens.LastToken.Type != ParalexLexer.EOF);
var tokenList = _tokens.GetTokens();
var tokenEnum = tokenList.GetEnumerator();
var tokenAvailable = tokenEnum.MoveNext();
if (tokenAvailable)
{
for (var i = 0; i < text.Length; i++)
{
var token = tokenEnum.Current;
if (token != null)
{
var c = text[i];
if (c == ' ' || c == '\t')
{
if (i > wordStart)
AddWord(document, line, wordStart, i);
line.Words.Add(c == ' ' ? TextWord.Space : TextWord.Tab);
wordStart = i + 1;
}
else
{
var atStartOfToken = (i == token.StartIndex);
if (atStartOfToken)
{
if (i > wordStart)
AddWord(document, line, wordStart, i);
var tokenLength = token.StopIndex - token.StartIndex + 1;
AddWord(document, line, i, tokenLength, token);
tokenEnum.MoveNext();
wordStart = i + tokenLength;
i = wordStart - 1;
}
}
}
}
}
}
if (wordStart < line.Length)
AddWord(document, line, wordStart, line.Length);
}
void AddWord(IDocument document, LineSegment line, int startOffset, int length, IToken token = null)
{
if (length==0) return;
var hasSpecialColor = token != null;
var color = hasSpecialColor ? GetColor(token) : _highlightColors["Default"];
line.Words.Add(new TextWord(document, line, startOffset, length, color, !hasSpecialColor));
if (token != null) Debug.WriteLine("From typing: Text {0}, Type {1}, Color {2}", token.Text, token.Type, color);
}
private HighlightColor GetColor(IToken token)
{
var name = token.Type;
var groupName = "Default";
var punctuation = new[]
{6, 7, 9, 14, 15, 16, 17, 18, 22, 28, 33, 34, 47, 48, 49, 50, 51, 52, 55, 56, 57, 58, 60, 62, 65, 71};
var paralexVerbs = new[] { 8, 13, 23, 26, 27, 31, 32, 38, 39, 40, 54, 64, 68, 73, 75, 76 };
var paralexNouns = new[] {11, 12, 42, 43, 59, 66};
var paralexNumbers = new[] { 53, 61, 41 };
var paralexStrings = new[] {70};
if (Array.IndexOf(punctuation, name) >= 0)
{
groupName = "Punctuation";
}
else if (Array.IndexOf(paralexVerbs, name) >= 0)
{
groupName = "ParalexVerbs";
}
else if (Array.IndexOf(paralexNouns, name) >= 0)
{
groupName = "ParalexNouns";
}
else if (Array.IndexOf(paralexNumbers, name) >= 0)
{
groupName = "ParalexNumbers";
}
else if (Array.IndexOf(paralexStrings, name) >= 0)
{
groupName = "ParalexStrings";
}
else if (name == 19)
{
groupName = "ParalexComment";
}
return _highlightColors[groupName];
}
Comment
: '//' ~('\r' | '\n')*
| '/*' .* '*/'
;
@lexer::members{
public const int StringChannel = 98;
public const int NumberChannel = 97;
public const int NounChannel = 96;
public const int VerbChannel = 95;
public const int CommentChannel = 94;
}
public class HighlightLexer : ParalexLexer
{
public override IToken Emit()
{
switch (state.type)
{
case Strng:
state.channel = StringChannel;
break;
case Nmber:
case Null:
case Bool:
case Instrument:
case Price:
case PeriodType:
state.channel = NumberChannel;
break;
case BarPeriod:
case BarValue:
case InstrumentList:
case SMA:
case Identifier:
state.channel = NounChannel;
break;
case Assert:
case Do:
case Else:
case End:
case Fetch:
case For:
case If:
case In:
case Return:
case Size:
case To:
case While:
case T__77:
state.channel = VerbChannel;
break;
case Comment:
state.channel = CommentChannel;
break;
default:
state.channel = DefaultTokenChannel;
break;
}
return base.Emit();
}
}
private void MarkUsingParalexTokens(IDocument document, LineSegment line)
{
var text = document.GetText(line).ToLower();
var input = new ANTLRStringStream(text);
_lexer.CharStream = input;
_tokens.TokenSource = _lexer;
var wordStart = 0;
var tokenCounter = 1;
for (var i = 0; i < text.Length; i++)
{
var token = _tokens.LT(tokenCounter);
if (token != null)
{
var c = text[i];
if (c == ' ' || c == '\t')
{
if (i > wordStart)
AddWord(document, line, wordStart, i);
line.Words.Add(c == ' ' ? TextWord.Space : TextWord.Tab);
wordStart = i + 1;
}
else
{
var atStartOfToken = (i == token.StartIndex);
if (atStartOfToken)
{
if (i > wordStart)
AddWord(document, line, wordStart, i);
var tokenLength = token.StopIndex - token.StartIndex + 1;
AddWord(document, line, i, tokenLength, token);
tokenCounter++;
wordStart = i + tokenLength;
i = wordStart - 1;
}
}
}
}
if (wordStart < line.Length)
AddWord(document, line, wordStart, line.Length);
}
void AddWord(IDocument document, LineSegment line, int startOffset, int length, IToken token = null)
{
if (length==0) return;
var hasSpecialColor = token != null;
var color = hasSpecialColor ? GetColor(token) : _highlightColors["Default"];
line.Words.Add(new TextWord(document, line, startOffset, length, color, !hasSpecialColor));
if (token != null) Debug.WriteLine("From typing: Text {0}, Type {1}, Color {2}", token.Text, token.Type, color);
}
private HighlightColor GetColor(IToken token)
{
var name = token.Channel;
var groupName = "Default";
if (name==0)
{
groupName = "Punctuation";
}
else if (name==95)
{
groupName = "ParalexVerbs";
}
else if (name==96)
{
groupName = "ParalexNouns";
}
else if (name==97)
{
groupName = "ParalexNumbers";
}
else if (name==98)
{
groupName = "ParalexStrings";
}
else if (name == 94)
{
groupName = "ParalexComment";
}
return _highlightColors[groupName];
}
最佳答案
我总是使用与其他解析任务不同的词法分析器来突出显示语法。用于语法高亮的词法分析器始终满足以下条件:
NEWLINE
之外没有 token 包含 \r
或 \n
性格。相反,多个词法分析器模式用于诸如块注释和任何其他跨越多行的结构(这甚至适用于 ANTLR 3 词法分析器,但如果不支持 ANTLR 3 本身的词法分析器模式,它会很快变得复杂)。 NEWLINE
定义如下:// ANTLR 3-based syntax highlighter:
NEWLINE : ('\r' '\n'? | '\n') {skip();};
// ANTLR 4-based syntax highlighter:
NEWLINE : ('\r' '\n'? | '\n') -> skip;
{$channel=Hidden;}
来自您的
Comment
规则,而是从您的基本词法分析器派生一个新类。在派生类中,覆盖
Emit()
.使用基本实现进行语法高亮显示,使用派生实现传递给解析器。在某些情况下这更容易,但是对于具有多行字符串或注释的语言会引入实质性的性能限制,我们发现我们的任何产品都无法接受这种限制。
public override IToken Emit()
{
if (state.type == Comment)
state.channel = Hidden;
return base.Emit();
}
关于ANTLR3 语法在 ICSharpCode.TextEditor 中突出显示隐藏 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15502426/
有没有人试过让 ICSharpCode.TextEditor 库在 Ubuntu 下的 Mono 下工作?我知道它使用了很多 P/Invoke 方法,如果有人找到了绕过这些方法的方法,那么了解它是如何
我正在使用 ICSharpcode 文本编辑器,我正在寻找一种在其中进行自动换行的方法。除了源代码之外,是否有任何相关文档?到目前为止,我唯一的文档是 Code Project article ,以及
我正在尝试在 ICSharpCode TextEditor 中选择文本行。以及使文本框转到特定行。该应用程序是使用 C# 在 VS 2010 中构建的 Windows 窗体应用程序。 我使用文本编辑器
我正在使用 ICSharpCode.TextEditor 并想更改语法颜色...在命名空间中 ICSharpCode.TextEditor.Document 有一个 public class High
是否可以在 ICSharpCode.TextEditor 中配置垂直滚动,这样默认情况下垂直滚动条是不可见的。而且只有当有人键入很多行(超出此控件的当前高度)时,垂直滚动条才会自动出现。如果是,如何?
我们目前使用 ICsharpCode.SharpZipLib 库的 GZipOutputStream 类进行压缩。我们从一个线程中完成。 我想将我的输入数据流分成块并并行压缩它们。 虽然我担心这个库可
大家好, 我正在尝试使用 ICSharpCode.SharpZipLib 库生成 Zip 文件,但它抛出了一个非常奇怪的错误。 代码: public static void ZipFiles(stri
好吧,我在将 ICSharpCode.SharpZipLib.dll 文件重命名为其他任何文件时遇到问题。我正在尝试缩短文件名。我在项目中引用了程序集,但是当程序到达我使用库的语句时。它会产生一个错误
我正在使用 ICSharpCode.SharpZipLib.Zip 压缩文件和文件夹,并使用 response.Binary write 将其作为内存流传递。 这是我的代码: MemoryStream
对于保守的标题和我的问题本身,我感到非常抱歉,但我迷路了。 ICsharpCode.ZipLib 提供的示例不包括我正在搜索的内容。我想通过将字节 [] 放入 InflaterInputStrea
我正在尝试为 ICSharpCode.TextEditor 创建自动完成功能。但是 fileTabs_KeyDown 无法识别 Enter/Backspace/Tab/... 我尝试向事件编辑器添加一
我在开发我们的小 DSL 方面取得了一些进展,但在尝试突出显示我们正在使用的 TextEditorControl 中的注释时遇到了问题。顺便说一下,ICSharpCode 控件非常棒,它与 ANTLR
我不明白如何让 Intellisense 在 ICSharpCode.TextEditor 中工作。截止到今天,回复还不完整。在网络上,没有样本...... 我需要显示一个包含自定义关键字的完成框。
zip 文件似乎已在我的驱动器上成功创建,并且包含我在 filePaths[] 中指定的文件 问题是,尽管将密码设置为“hello”,但当我尝试解压缩文件时,它会提示密码不正确。 /// /
我能够使用 Mono.Cecil 和 ICSharpCode.Decompiler 为类型或程序集生成代码。 但是如果我尝试为单个方法生成代码,我将收到错误“对象引用未设置为对象的实例。” 你们能给我
是否有用于 ICSharpCode.TextEditor 的 Common Lisp 语法突出显示 .xshd 文件?我一直无法在谷歌上找到一个,并且编写语法突出显示规范文件的格式是如此糟糕地记录在案
使用 C# 的 ICSharpCode.SharpZipLib,我如何验证传递的文件实际上是一个有效的 zip 文件(不是右键单击并重命名为 .zip 的文件)? [HttpPost]
我正在使用 ICSharpCode.SharpZipLib.Zip.FastZip 来压缩文件,但我遇到了一个问题: 当我尝试压缩文件名中包含特殊字符的文件时,它不起作用。它在文件名中没有特殊字符时有
我必须在使用 ICSharpCode.SharZipLib.Zip 以编程方式创建的 zip 文件中创建两个文件夹。我想: private void AddToZipStream(byte[]
我正在使用库 ICSharpCode.SharpZipLib.Zip; 我的代码如下: 路径是根。 \\ALAWP\\THIS\\ACORD\\ 我正在将它们压缩到 ZIPDirectory 但是当它
我是一名优秀的程序员,十分优秀!