这一直困扰着我一段时间.如何使用ANTLR将以下文本解析到下面的HTML中?我似乎根本无法解决这个问题.
有任何想法吗?
降价:
> first line > second line > > nested quote
输出HTML:
<blockquote>
<p>first line
second line</p>
<blockquote>
<p>nested quote</p>
</blockquote>
</blockquote>
Run Code Online (Sandbox Code Playgroud) 我正在ASP.NET/C#中编写CMS,我需要处理每个页面请求这样的事情:
<html>
<head>
<title>[Title]</title>
</head>
<body>
<form action="[Action]" method="get">
[TextBox Name="Email", Background=Red]
[Button Type="Submit"]
</form>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
并当然更换[...]。
我的问题是我应该如何使用ANTLR或Regex来实现它?什么会更快?请注意,如果我要使用ANTLR来实现它,我认为我需要实现XML,作为[..]的附加内容。
我将需要实现参数,等等。
编辑:请注意,我的正则表达式甚至看起来像这样:
public override string ToString()
{
return Regex.Replace(Input, @"\[
\s*(?<name>\w+)\s*
(?<parameter>
[\s,]*
(?<paramName>\w+)
\s*
=
\s*
(
(?<paramValue>\w+)
|
(""(?<paramValue>[^""]*)"")
)
)*
\]", (match) =>
{
...
}, RegexOptions.IgnorePatternWhitespace);
}
Run Code Online (Sandbox Code Playgroud) 我正在用相同编程语言的某些方言之间编写一个转换器.我在网上找到了一个语法 - 它很复杂,处理所有情况.现在我正在尝试编写适当的操作.
大多数输入只是被重写为输出.我需要做的是解析函数调用,做我的魔术(重命名函数,重新排序参数等)并编写它.
我正在使用AST作为输出.当我遇到函数调用时,我构建了一个自定义对象结构(从我的目标语言定义的类),调用适当的函数,我有一个字符串,表示我想要获得的转换函数.
问题是,我应该用那个字符串做什么?我想替换封闭规则的.text属性,但setText()仅在词法分析器规则上可用,并且规则的.text属性是只读的.如何解决这个问题呢?
program
: statement_list { output = $statement_list.text; }
;
//...
statement
: expression_statement
// ...
;
expression_statement
: function_call
// ...
;
function_call
: ID '(' { /* build the object, assign name */
Function function = new Function();
//...
}
(
arg1 = expression { /* add first parameter */ }
( ',' arg2 = expression { /* add the rest of parameters */ }
)*
)?
')' { /* convert the function …Run Code Online (Sandbox Code Playgroud) 以下语法有效,但也会发出警告:
grammar test;
options {
language = Java;
output = AST;
ASTLabelType = CommonTree;
}
program
: expr ';'!
;
term: ID | INT
;
assign
: term ('='^ expr)?
;
add : assign (('+' | '-')^ assign)*
;
expr: add
;
// T O K E N S
ID : (LETTER | '_') (LETTER | DIGIT | '_')* ;
INT : DIGIT+ ;
WS :
( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
DOT …Run Code Online (Sandbox Code Playgroud) 我写过这个语法:
expr : multExpr ( ('+' | '-') multExpr )*;
multExpr : atom ( ('*' | '/') atom )*;
atom : INT | FLOAT | ID | '(' expr ')';
condition : cond ('or' cond)*;
cond : c1 ('and' c1)*;
c1 : ('not')? c2;
c2 : '(' condition ')' | boolean;
boolean : expr (relop expr | ²) | 'true' | 'false';
relop : '<' | '<=' | '>' | '>=' | '==' | '!=';
Run Code Online (Sandbox Code Playgroud)
我已经省略了INT,FLOAT,ID的词法规则,因为很明显.
问题是c2规则,它是模棱两可的,因为'(',我找不到解决方案,你能给我一个解决方案吗?
我在堆栈溢出中找到了与"多个替代"相关的问题,但没有什么有用的.这是我在antlr3中的g文件的一部分.
statement:
selection_stmt
| expression_stmt
| compound_stmt
| iteration_stmt
| return_stmt
;
selection_stmt:
IF OPENB expression CLOSB statement (ELSE statement)?
;
expression:
(var ASSIGN expression) => assignment
| simple_expression
;
Run Code Online (Sandbox Code Playgroud)
我面临的问题是我收到上述短语的警告ELSE statement.
(200):决策可以使用多个备选方案匹配输入,例如"ELSE":1,2结果,对于该输入禁用了备选方案2
谁能解释一下这里发生了什么?谢谢.
PS当我使用句法谓词时((ELSE)=>ELSE statement)?,警告消失.我也不明白这个原因.
给出以下词法分析器:
lexer grammar CodeTableLexer;
@header {
package ch.bsource.ice.parsers;
}
CodeTabHeader : OBracket Code ' ' Table ' ' Version CBracket;
CodeTable : Code ' '* Table;
EndCodeTable : 'end' ' '* Code ' '* Table;
Code : 'code';
Table : 'table';
Version : '1.0';
Row : 'row';
Tabdef : 'tabdef';
Override : 'override' | 'no_override';
Obsolete : 'obsolete';
Substitute : 'substitute';
Status : 'activ' | 'inactive';
Pkg : 'include_pkg' | 'exclude_pkg';
Ddic : 'include_ddic' | 'exclude_ddic';
Tab : 'tab';
Naming …Run Code Online (Sandbox Code Playgroud) 这是我第一次与ANTLR合作在伦敦帝国理工学院开展项目,直到现在它才非常有用.我已经定义了一个简单的递归语法如下
grammar Hello;
execution: workflow;
workflow : Task
| workflow OPERATOR workflow
|'(' workflow OPERATOR workflow ')'
|'(' workflow OPERATOR workflow ')' (OPERATOR workflow)*
;
Task : 'T' ('0'..'9')+ | 'WF' ('0'..'9')+;
OPERATOR: 'AND' | 'OR' | 'XOR' |';' ;
WS : [ \t\n\r]+ -> channel(HIDDEN) ;
Run Code Online (Sandbox Code Playgroud)
评估字符串,如:
T6 ; (T4 AND T7) ; T5 ; ( (WF23 OR WF2) OR (T3 AND WF4) AND T4) AND T5 OR T11
Run Code Online (Sandbox Code Playgroud)
并且它完美地运行,当我尝试评估不正确的字符串时,我的问题就出现了
T6 ; (T4 AND T7) ; T5 ; ( …Run Code Online (Sandbox Code Playgroud) 我需要编写一个Java程序,使用ANTLR4它,给定一个带有单个方法的源文件,可以计算变量,运算符,标点符号和保留字的数量.
我如何ANTLR4根据其类型使用计数令牌?
我找到了一个简单的语法来开始学习ANTLR.我把它放在myGrammar.g文件中.这是语法:
grammar myGrammar;
/* This will be the entry point of our parser. */
eval
: additionExp
;
/* Addition and subtraction have the lowest precedence. */
additionExp
: multiplyExp
( '+' multiplyExp
| '-' multiplyExp
)*
;
/* Multiplication and division have a higher precedence. */
multiplyExp
: atomExp
( '*' atomExp
| '/' atomExp
)*
;
atomExp
: Number
| '(' additionExp ')'
;
/* A number: can be an integer value, or a decimal value */
Number …Run Code Online (Sandbox Code Playgroud) antlr ×10
antlr3 ×3
parsing ×3
antlr4 ×2
antlrworks ×2
java ×2
lexer ×2
.net ×1
antlrv3ide ×1
c# ×1
grammar ×1
ll-grammar ×1
markdown ×1
performance ×1
regex ×1
rewrite ×1