在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) 我正在尝试将ANTLR定义的语法集成到NetBeans中,到目前为止,有效的语法工作正常.但是,当前如果输入任何未在某处语言中定义的字符(例如,"?"字符),自定义编辑器会立即崩溃,因为它无法找到该字符的规则.
在没有整个词法分析器崩溃和刻录的情况下,ANTLR中是否有一种方法可以捕获并跳过与规则不匹配的每个字符(并且可能输出错误消息)?我想标记无效字符,跳过它们,然后继续lexing,例如:
//some rules + tokens
invalidCharacter
: <<catch all other characters>>
{System.out.println("undefined character entered!")}
;
Run Code Online (Sandbox Code Playgroud)
任何帮助都会被批准.
给出以下词法分析器:
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) 我正在尝试编写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规则可以正常工作(例如,可以),但是两个注释规则似乎没有任何效果。(即,评论不会被忽略)。
我想念什么?
我正在尝试为类似 XML 的语言编写语法,其中我们使用 << 而不是 < 字符。这是词法分析器的部分快照,其中 TEXT 表示(外部)标签之间的文本:
OPEN : '<<' ;
CLOSE : '>>' ;
TEXT : ~[^<]+ ;
Run Code Online (Sandbox Code Playgroud)
上面 TEXT 的定义显然是错误的,因为即使一个后面没有另一个 <,它也会在第一次出现 < 时停止。我正在寻找一种方法来定义“捕获所有内容,直到遇到 <<”,但不将 << 包含在匹配中。
所以这样的事情也行不通:
TEXT : .*? '<<' ;
Run Code Online (Sandbox Code Playgroud)
有没有办法在 ANTLR4 中实现这一点?
——TR
全部,
我一直在尝试从标准文档 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) 我找到了一个简单的语法来开始学习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) 我正在为 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,更具体地说,使用 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) 您认为初始化的声明符是 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++ 词法分析器中。
* 实际上并不相同。文本恰好区分了声明符和独立的初始化部分。