标签: lexer

调用本机Javascript类型的方法而不用()包装

在Javascript中,我们可以直接调用字符串文字的方法而不将其括在圆括号内.但不适用于其他类型,如数字或函​​数.这是一个语法错误,但有没有理由为什么Javascript词法分析器需要将这些其他类型括在圆括号中?

例如,如果我们使用alert方法扩展Number,String和Function并尝试在文字上调用此方法,则它是Number和Function的SyntaxError,而它适用于String.

function alertValue() {
    alert(this);
}

Number.prototype.alert = alertValue;
String.prototype.alert = alertValue;
Function.prototype.alert = alertValue;
Run Code Online (Sandbox Code Playgroud)

我们可以直接在字符串对象上调用alert:

"someStringLiteral".alert() // alerts someStringLiteral
Run Code Online (Sandbox Code Playgroud)

但它是关于数字和函数的SyntaxError.

7.alert();
function() {}.alert();
Run Code Online (Sandbox Code Playgroud)

要使用这些类型,我们必须将其括在括号内:

(7).alert(); // alerts "7"
(function() {}).alert(); // alerts "function() {}"
Run Code Online (Sandbox Code Playgroud)

更新:

@Crescent的链接和@Dav和@Timothy的答案解释了为什么7.alert()失败,因为它正在寻找一个数值常量,并且为了超越它,插入额外的空格或额外的点.

7 .alert()
7..alert()
7. .alert();
Run Code Online (Sandbox Code Playgroud)

是否有类似的语法原因,为什么在调用方法之前需要将函数括在括号中?

我不熟悉解释器和词法分析器,知道它是否可以通过某种先行的方式解决,因为Ruby是一种动态语言并且可以解决这个问题.例如:-

7.times { |i| print i }
Run Code Online (Sandbox Code Playgroud)

更新2:

@ CMS的答案一直在理解为什么功能不起作用.以下陈述有效:

// comma operator forces evaluation of the function
// alerts "function() {}"
<any literal>, function() {}.alert();???????

// all examples below are forced …
Run Code Online (Sandbox Code Playgroud)

javascript methods syntax lexer

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

在ANTLR中捕获"所有其他"字符

我正在尝试将ANTLR定义的语法集成到NetBeans中,到目前为止,有效的语法工作正常.但是,当前如果输入任何未在某处语言中定义的字符(例如,"?"字符),自定义编辑器会立即崩溃,因为它无法找到该字符的规则.

在没有整个词法分析器崩溃和刻录的情况下,ANTLR中是否有一种方法可以捕获并跳过与规则不匹配的每个字符(并且可能输出错误消息)?我想标记无效字符,跳过它们,然后继续lexing,例如:

//some rules + tokens

invalidCharacter
    :    <<catch all other characters>>
        {System.out.println("undefined character entered!")}
    ;
Run Code Online (Sandbox Code Playgroud)

任何帮助都会被批准.

grammar antlr character lexer

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

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
查看次数

无法使ANTLR4语法跳过注释

我正在尝试编写ANTLR4语法来解析actionscript3。我决定从一些粗略的东西开始:

grammar actionscriptGrammar;

OBRACE:'{';
CBRACE:'}';
STRING_DELIM:'"';

BLOCK_COMMENT : '/*' .*? '*/' -> skip;
EOL_COMMENT : '//' .*? '/n' -> skip;
WS: [ \n\t\r]+ -> skip;

TEXT: ~[{} \n\t\r"]+;

thing
    : TEXT
    | string_literal
    | OBRACE thing+? CBRACE;

string_literal : STRING_DELIM .+? STRING_DELIM;

start_rule
    : thing+?;
Run Code Online (Sandbox Code Playgroud)

基本上,我想要一棵按其词法范围分组的事物树。我希望忽略注释,字符串文字是它们自己的东西,这样它们可能包含的任何大括号都不会影响词​​法范围。string_literal规则可以正常工作(例如,可以),但是两个注释规则似乎没有任何效果。(即,评论不会被忽略)。

我想念什么?

comments lexer antlr4

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

ANTLR V4 词法分析器前瞻正则表达式

我正在尝试为类似 XML 的语言编写语法,其中我们使用 << 而不是 < 字符。这是词法分析器的部分快照,其中 TEXT 表示(外部)标签之间的文本:

OPEN  : '<<' ;
CLOSE : '>>' ;
TEXT  : ~[^<]+ ;
Run Code Online (Sandbox Code Playgroud)

上面 TEXT 的定义显然是错误的,因为即使一个后面没有另一个 <,它也会在第一次出现 < 时停止。我正在寻找一种方法来定义“捕获所有内容,直到遇到 <<”,但不将 << 包含在匹配中。

所以这样的事情也行不通:

TEXT  : .*? '<<' ;
Run Code Online (Sandbox Code Playgroud)

有没有办法在 ANTLR4 中实现这一点?

——TR

regex parsing antlr lexer antlr4

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

ANTLR4 Lexing C++11 原始字符串

全部,

我一直在尝试从标准文档 N4567 创建 C++ 语法,这是我能找到的最新版本。我相信语法是完整的,但我需要测试它。我一直试图解决的一个问题是让词法分析器从标准中识别原始字符串。我已经使用 Actions & Semantic Predicates 实现了一个可能的解决方案。我需要帮助确定它是否真的有效。我已经阅读了关于操作和谓词之间交互的 ANTLR4 参考,但可以决定我的解决方案是否有效。下面包含一个精简语法。任何想法将不胜感激。我试图将我的想法包含在样本中。

grammar SampleRaw;

@lexer::members {
    string d_char_seq = "";
}

string_literal
        : ENCODING_PREFIX? '\"' S_CHAR* '\"'
        | ENCODING_PREFIX? 'R' Raw_String
        ;

ENCODING_PREFIX             //  one of
        : 'u8'
        | [uUL]
        ;

S_CHAR          /* any member of the source character set except the
                   double_quote ", backslash \, or NEW_LINE character
                 */
        : ~[\"\\\n\r]
        | ESCAPE_SEQUENCE
        | UNIV_CHAR_NAME
        ;

fragment ESCAPE_SEQUENCE
        : SIMPLE_ESCAPE_SEQ
        | OCT_ESCAPE_SEQ
        | HEX_ESCAPE_SEQ
        ;
fragment SIMPLE_ESCAPE_SEQ  // …
Run Code Online (Sandbox Code Playgroud)

c++ antlr lexer c++11 antlr4

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

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

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

ANTLR4 PLSQL 语法 Python 3 缺失函数

我正在为 Antlr4使用这个语法https://github.com/antlr/grammars-v4/tree/master/plsql但我收到一个错误,因为它指的是一个不存在的函数。

'NameError: 名称 'IsNewlineAtPos' 未定义 '

我可以看到有人更新了 csharp 版本的两个文件(那些是额外的项目?基本词法分析器和解析器?其中包括引用以下代码中的函数的更新。

// https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve034.htm#SQPUG054
REMARK_COMMENT:      'REM' {IsNewlineAtPos(-4)}? 'ARK'? (' ' ~('\r' | '\n')*)? NEWLINE_EOF -> channel(HIDDEN);

// https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve032.htm#SQPUG052
PROMPT_MESSAGE:      'PRO' {IsNewlineAtPos(-4)}? 'MPT'? (' ' ~('\r' | '\n')*)? NEWLINE_EOF;

// TODO: should starts with newline
START_CMD
    //: 'STA' 'RT'? SPACE ~('\r' | '\n')* NEWLINE_EOF
    // https://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12002.htm
    // https://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12003.htm
    : '@' {IsNewlineAtPos(-2)}? '@'? ~('\r' | '\n')* NEWLINE_EOF
    ;
Run Code Online (Sandbox Code Playgroud)

这是 git 的更新

https://github.com/antlr/grammars-v4/commit/94887a3f4c9040578ef01b561e1d5e0ec54cbe9b

我正在使用 Python 来运行它,如果有人能告诉我他们为什么“扩展”以及他们创建的这个函数的作用,我将不胜感激。(如果他们能告诉我如何转换为 python 3,那就太棒了)

python parsing plsql lexer antlr4

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

用 python 为新的编程语言编写词法分析器

我不知道如何/从哪里开始。我应该使用 python,更具体地说,使用 ply 库。到目前为止,我所做的只是创建一个将成为该语言一部分的标记列表。该列表如下:


tokens = (
                                                         # OPERATORS #
    'PLUS' ,        # +
    'MINUS' ,       # -
    'MULTIPLY',     # *
    'DIVIDE',       # /
    'MODULO',       # %


    'NOT',          # ~
    'EQUALS',       # =

                                                         # COMPARATORS #
    'LT',           # <
    'GT',           # >
    'LTE',          # <=
    'GTE',          # >=
    'DOUBLEEQUAL',  # ==
    'NE',           # #


    'AND',          # &
    'OR',           # |
                                                    # CONDITIONS AND LOOPS #    

    'IF',           # if
    'ELSE',         # else
    'ELSEIF',       # elseif
    'WHILE',        # while
    'FOR',          # for …
Run Code Online (Sandbox Code Playgroud)

python programming-languages lexer

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

C++ catch 语句内的初始化声明符

您认为初始化的声明符是 catch 语句的捕获声明部分内的有效词法结构吗?例如,看一下下面的代码:

void func( int = 1 )
{
    try
    {

    }
    catch( int a = 1 )
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

它在最新的 MSVC 17.0.2 下编译良好,但在最新的 GCC 11.2 下无法编译(使用 Godbolt.org 测试)。我想知道答案,以便对 C++ 代码的正确类型形成纯粹的词汇理解。

如果您阅读了这篇 cppreference.com 文章,那么您会发现它说声明应该与函数签名参数的 (*) 完全相同,从而将合法性放入 MSVC C++ 词法分析器中。

* 实际上并不相同。文本恰好区分了声明符和独立的初始化部分。

c++ syntax lexer language-lawyer

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