当前位置: 首页 > 知识库问答 >
问题:

通过Antlr 4 lexer/parser抓取所有空行

云隐水
2023-03-14

尝试通过ANTLR4 lexer/parser抓取给定PHP文件的所有空行(仅行号)。我使用的语法在GitHub Antlr语法for PHP上可用。

定义为:

Whitespace:         [ \t\r\n]+ -> skip;
Whitespace: (
             ' ' 
             | '\t' 
             | '\r' '\n' { newline(); } 
             | '\n'       { newline(); }
            );

测试的示例PHP:

<?php

//02-5002201-00001 5002201 - Machine hours test

	function test()
	{	
/*	Name:			Test.php

	Title:			Demo

	by:				XYZ
*/
		if (true && false)
		{		
			echo "aa";
		}

//TODO		
		echo <<<SEGDTA
		<link rel="stylesheet" type="text/css" href="ui.css"/>

		<script type="text/javascript" src="min.js"></script>
		SEGDTA;
	}

?>

共有1个答案

胡禄
2023-03-14

试试下面这样的方法:

lexer grammar DemoLexer;

EmptyLine
 : {super.getCharPositionInLine() == 0}? [ \t]* '\r'? '\n'
 ;

Whitespace
 : [ \t\r\n] -> skip
 ;

Other
 : .
 ;

如果运行以下测试类:

import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.Token;

public class Main {

    public static void main(String[] args) {

        String source = "foo\n" +
                "\n" +
                "bar\n" +
                "    \n" +
                "   baz   \r\n" +
                " \t\t\n" +
                "\tend\n\n";

        DemoLexer lexer = new DemoLexer(CharStreams.fromString(source));

        for (Token t : lexer.getAllTokens()) {

            String name = lexer.getTokenNames()[t.getType()];
            String text = t.getText().replace("\r","\\r").replace("\n","\\n").replace("\t","\\t");

            System.out.printf("%-20s '%s'\n", name, text);
        }
    }
}

这将被打印:

Other                'f'
Other                'o'
Other                'o'
EmptyLine            '\n'
Other                'b'
Other                'a'
Other                'r'
EmptyLine            '    \n'
Other                'b'
Other                'a'
Other                'z'
EmptyLine            ' \t\t\n'
Other                'e'
Other                'n'
Other                'd'
EmptyLine            '\n'

参见:http://www.antlr.org/api/java/org/antlr/v4/runtime/tokensource.html#GetCharPositionInline()

 类似资料:
  • 问题内容: 我正在使用一些房屋更换产品,使我可以隐藏通知栏,而这正是我真正喜欢的东西。 所有信息都可以用一些小部件代替,但是我也想显示通知。 当我已经开发了一些应用程序时,我想知道是否存在允许应用程序获取所有通知的命令行。我打算将此添加到小部件或烤面包。 非常感谢您提供任何线索或帮助。 问题答案: 从Android API级别18(Android 4.3)开始,提供了一个类 Notificatio

  • 问题内容: 对于公司项目,我需要使用PHP和JavaScript(包括jQuery)创建一个Web抓取应用程序,该应用程序将从客户网站的每个页面提取特定数据。抓取应用需要为每个页面获取两种类型的数据:1)确定是否存在具有特定ID的某些HTML元素,以及2)提取特定JavaScript变量的值。每个页面上的JS变量名称都相同,但是值通常不同。 我相信我知道如何获得第一个数据要求:使用PHP file

  • 问题内容: [我想做的事] 刮擦下面的网页以获取二手车数据。 http://www.goo- net.com/php/search/summary.php?price_range=&pref_c=08,09,10,11,12,13,14&easysearch_flg=1 [问题] 刮整个页面。在上面的网址中,仅显示前30个项目。我可以在下面编写的代码中删除这些内容。指向其他页面的链接显示为1 2

  • 我使用youtube API制作了一个应用程序。首先,我使用< code > retrieve 加载视频列表,然后我继续使用< code > retrieve 加载列表中视频的所有信息。 由于<code>列表视图<code>支持刷新和加载更多,我需要<code>取消<code>所有调用请求。 我知道调用了<code>cancel()cancel()。 还有更好的解决方案吗?

  • 问题内容: 我需要插入所有随发布发送的变量,它们是每个代表用户的复选框。 如果我使用GET,将会得到如下信息: 我需要在数据库中插入变量。 如何获取所有通过POST发送的变量?用逗号或其他东西隔开的数组或值? 问题答案: 该变量将自动填充。 尝试查看内容。 您可以这样访问各个值: 当然,这假设您的表单使用的是典型的表单编码(即 如果您的帖子数据采用其他格式(例如JSON或XML),则可以执行以下操