标签: antlr

使用ANTLR解析Markdown blockquote

这一直困扰着我一段时间.如何使用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)

compiler-construction markdown parsing antlr ll-grammar

3
推荐指数
1
解决办法
1098
查看次数

ANTLR还是Regex?

我正在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)

.net c# regex performance antlr

3
推荐指数
1
解决办法
1481
查看次数

在ANTLR中编写语言转换器

我正在用相同编程语言的某些方言之间编写一个转换器.我在网上找到了一个语法 - 它很复杂,处理所有情况.现在我正在尝试编写适当的操作.

大多数输入只是被重写为输出.我需要做的是解析函数调用,做我的魔术(重命名函数,重新排序参数等)并编写它.

我正在使用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)

rewrite antlr

3
推荐指数
1
解决办法
2144
查看次数

ANTLR赋值表达式消歧

以下语法有效,但也会发出警告:

test.g

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)

parsing antlr

3
推荐指数
1
解决办法
738
查看次数

如何解决这种模棱两可的语法?

我写过这个语法:

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规则,它是模棱两可的,因为'(',我找不到解决方案,你能给我一个解决方案吗?

antlr antlrworks antlr3

3
推荐指数
1
解决办法
453
查看次数

如何删除ANTLR3警告'多个替代品'

我在堆栈溢出中找到了与"多个替代"相关的问题,但没有什么有用的.这是我在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)?,警告消失.我也不明白这个原因.

grammar antlr context-free-grammar antlr3

3
推荐指数
1
解决办法
1308
查看次数

ANTLR:如何跳过多行注释

给出以下词法分析器:

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 parser-generator lexer

3
推荐指数
1
解决办法
4606
查看次数

在评估不符合我的语法定义的字符串时,ANTLR不报告错误

这是我第一次与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)

antlr antlrworks antlr3 antlrv3ide antlr4

3
推荐指数
1
解决办法
103
查看次数

使用ANTLR4计数令牌

我需要编写一个Java程序,使用ANTLR4它,给定一个带有单个方法的源文件,可以计算变量,运算符,标点符号和保留字的数量.

我如何ANTLR4根据其类型使用计数令牌?

java antlr antlr4

3
推荐指数
1
解决办法
1512
查看次数

词法分析器动作中不允许使用属性引用

我找到了一个简单的语法来开始学习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)

java parsing antlr lexer

3
推荐指数
1
解决办法
1029
查看次数