gpt4 book ai didi

ANTLR : How to replace all characters defined as space with actual space

转载 作者:行者123 更新时间:2023-12-04 06:38:51 29 4
gpt4 key购买 nike

我的 ANTLR 代码如下:

LPARENTHESIS : ('('); 
RPARENTHESIS : (')');

fragment CHARACTER : ('a'..'z'|'0'..'9'|);
fragment QUOTE : ('"');
fragment WILDCARD : ('*');
fragment SPACE : (' '|'\n'|'\r'|'\t'|'\u000C'|';'|':'|',');

WILD_STRING
: (CHARACTER)*
(
('?')
(CHARACTER)*
)+
;
PREFIX_STRING
: (CHARACTER)+
(
('*')
)+
;
WS : (SPACE) { $channel=HIDDEN; };
PHRASE : (QUOTE)(LPARENTHESIS)?(WORD)(WILDCARD)?(RPARENTHESIS)?((SPACE)+(LPARENTHESIS)?(WORD)(WILDCARD)?(RPARENTHESIS)?)*(SPACE)+(QUOTE);
WORD : (CHARACTER)+;

我想做的是将所有标记为空格的字符替换为 PHRASE 中的实际空格字符。此外,如果可能的话,我希望所有连续的空间都由一个空间表示。

非常感激任何的帮助。出于某种原因,我发现很难理解 ANTLR。有什么好的教程吗?

最佳答案

java

调用您的 lexer's setText(...) method :

grammar T;

parse
: words EOF {System.out.println($words.text);}
;

words
: Word (Spaces Word)*
;

Word
: ('a'..'z'|'A'..'Z')+
;

Spaces
: (' ' | '\t' | '\r' | '\n')+ {setText(" ");}
;

可以使用该类进行测试:
import org.antlr.runtime.*;

public class Main {
public static void main(String[] args) throws Exception {
String source = "This is \n just \t\t\t\t\t\t a \n\t\t test";
ANTLRStringStream in = new ANTLRStringStream(source);
TLexer lexer = new TLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
TParser parser = new TParser(tokens);
System.out.println("------------------------------\nSource:\n" + source +
"\n------------------------------\nAfter parsing:");
parser.parse();
}
}

产生以下输出:
------------------------------
Source:
This is
just a
test
------------------------------
After parsing:
This is just a test

Puneet Pawaia wrote:

Any help would be most appreciated. For some reason, I am finding it hard to understand ANTLR. Any good tutorials out there ?



ANTLR Wiki有大量信息丰富的信息,虽然有点非结构化(但那可能只是我!)。

最好的 ANTLR 教程是这本书: The Definitive ANTLR Reference: Building Domain-Specific Languages .

C#

对于 C# 目标,试试这个:
grammar T;

options {
language=CSharp2;
}

@parser::namespace { Demo }
@lexer::namespace { Demo }

parse
: words EOF {Console.WriteLine($words.text);}
;

words
: Word (Spaces Word)*
;

Word
: ('a'..'z'|'A'..'Z')+
;

Spaces
: (' ' | '\t' | '\r' | '\n')+ {Text = " ";}
;

与测试类:
using System;
using Antlr.Runtime;

namespace Demo
{
class MainClass
{
public static void Main (string[] args)
{
ANTLRStringStream Input = new ANTLRStringStream("This is \n just \t\t\t\t\t\t a \n\t\t test");
TLexer Lexer = new TLexer(Input);
CommonTokenStream Tokens = new CommonTokenStream(Lexer);
TParser Parser = new TParser(Tokens);
Parser.parse();
}
}
}

它还打印 This is just a test到控制台。我尝试使用 SetText(...)而不是 setText(...)但这也不起作用, C# API docs目前离线,所以我使用了试错法 {Text = " ";} .我用 C# 3.1.1 runtime DLL's 测试了它.

祝你好运!

关于ANTLR : How to replace all characters defined as space with actual space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4526600/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com